On Tue, Oct 13, 2015 at 02:22:36PM +0300, Maxim Ostapenko wrote:
This is the final patch. Force libsanitizer to use an old ABI for ubsan
float cast data descriptors, because for some exprs (e.g. that type of
tcc_declaration) we can't get the right location for now. I'm not sure about
this, perhaps it should be fixed in GCC somehow.
I don't like this (neither the heuristics on the libubsan, it wouldn't be a
big deal to add a new library entrypoint).
If because of the heuristics you need to ensure that the SourceLocation is
always known, then either you check in ubsan.c whether expand_location
gives you NULL xloc.file and in that case use old style float cast overflow
(without location) - i.e. pass 0, NULL, otherwise you use new style, i.e.
pass 1, &loc. Or arrange through some special option to emit something like
{ "<unknown>", 0, 0 } instead of { NULL, 0, 0 } for the float cast case.
And, regardless of this, any progress in making sure we have fewer cases
with UNKNOWN_LOCATION on this will not hurt. I think at this point I'd
prefer the first choice, i.e. using old style for locations without
filename, and new style otherwise.
2015-10-13 Maxim Ostapenko <m.ostapenko@partner.samsung.com>
* ubsan/ubsan_handlers.cc (looksLikeFloatCastOverflowDataV1): Always
return true for now.
Index: libsanitizer/ubsan/ubsan_handlers.cc
===================================================================
--- libsanitizer/ubsan/ubsan_handlers.cc (revision 250059)
+++ libsanitizer/ubsan/ubsan_handlers.cc (working copy)
@@ -307,6 +307,9 @@
}
static bool looksLikeFloatCastOverflowDataV1(void *Data) {
+ // (TODO): propagate SourceLocation into DataDescriptor and use this
+ // heuristic than.
+ return true;
// First field is either a pointer to filename or a pointer to a
// TypeDescriptor.
u8 *FilenameOrTypeDescriptor;
Jakub