[PATCH v2 05/10] meson: Disable -fsanitize=function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Strictly speaking, xdrproc_t is declared as following:

  typedef bool_t (*xdrproc_t)(XDR *, ...);

But our rpcgen generates properly typed functions, e.g.:

  bool_t xdr_virNetMessageError(XDR *xdrs, virNetMessageError *objp)

Now, these functions of ours are passed around as callbacks (via
an argument of xdrproc_t type), for instance in
virNetMessageEncodePayload(). But these two types are strictly
different. We silence the compiler by typecasting the callbacks
when passing them, but strictly speaking - calling such callback
later, when a function of xdrproc_t is expected is an undefined
behavior.

Ideally, we would fix our rpcgen to generate proper function
headers, but: a) my brain is too small to do that, and b) we
would lose compiler protection if an xdr_*() function is called
directly but argument of a wrong type is passed.

Silence UBSAN for now.

Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
Reviewed-by: Daniel P. Berrangé <berrange@xxxxxxxxxx>
---
 meson.build | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/meson.build b/meson.build
index e8b0094b91..cb374ab118 100644
--- a/meson.build
+++ b/meson.build
@@ -438,6 +438,19 @@ if cc.get_id() == 'clang'
     cc_flags += [ '-fsemantic-interposition' ]
 endif
 
+if get_option('b_sanitize') != 'none'
+  # This is needed because of xdrproc_t. It's declared as a pointer to a
+  # function with variable arguments. But for catching type related problems at
+  # compile time, our rpcgen generates functions with proper types, say:
+  #
+  #    bool_t xdr_TestEnum(XDR *, TestEnum *);
+  #
+  # But passing xdr_TestEnum as a callback where xdrproc_t type is expected is
+  # undefined behavior. Yet, we want the comfort of compile time checks, so
+  # just disable the sanitizer warning for now. It's a big hammer though.
+  cc_flags += [ '-fno-sanitize=function' ]
+endif
+
 supported_cc_flags = []
 if get_option('warning_level') == '2'
   supported_cc_flags = cc.get_supported_arguments(cc_flags)
-- 
2.43.2
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux