[compiler-rt] r178458 - [ASan] More careful reports for globals that are ASCII strings

Alexey Samsonov samsonov at google.com
Mon Apr 1 01:57:38 PDT 2013


Author: samsonov
Date: Mon Apr  1 03:57:38 2013
New Revision: 178458

URL: http://llvm.org/viewvc/llvm-project?rev=178458&view=rev
Log:
[ASan] More careful reports for globals that are ASCII strings

Modified:
    compiler-rt/trunk/lib/asan/asan_report.cc
    compiler-rt/trunk/lib/asan/lit_tests/global-demangle.cc

Modified: compiler-rt/trunk/lib/asan/asan_report.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_report.cc?rev=178458&r1=178457&r2=178458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_report.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_report.cc Mon Apr  1 03:57:38 2013
@@ -180,21 +180,23 @@ static bool IsASCII(unsigned char c) {
   return /*0x00 <= c &&*/ c <= 0x7F;
 }
 
-// Check if the global is a zero-terminated ASCII string. If so, print it.
-static void PrintGlobalNameIfASCII(const __asan_global &g) {
-  for (uptr p = g.beg; p < g.beg + g.size - 1; p++) {
-    if (!IsASCII(*(unsigned char*)p)) return;
-  }
-  if (*(char*)(g.beg + g.size - 1) != 0) return;
-  Printf("  '%s' is ascii string '%s'\n", g.name, (char*)g.beg);
-}
-
 static const char *MaybeDemangleGlobalName(const char *name) {
   // We can spoil names of globals with C linkage, so use an heuristic
   // approach to check if the name should be demangled.
   return (name[0] == '_' && name[1] == 'Z') ? Demangle(name) : name;
 }
 
+// Check if the global is a zero-terminated ASCII string. If so, print it.
+static void PrintGlobalNameIfASCII(const __asan_global &g) {
+  for (uptr p = g.beg; p < g.beg + g.size - 1; p++) {
+    unsigned char c = *(unsigned char*)p;
+    if (c == '\0' || !IsASCII(c)) return;
+  }
+  if (*(char*)(g.beg + g.size - 1) != '\0') return;
+  Printf("  '%s' is ascii string '%s'\n",
+         MaybeDemangleGlobalName(g.name), (char*)g.beg);
+}
+
 bool DescribeAddressRelativeToGlobal(uptr addr, uptr size,
                                      const __asan_global &g) {
   static const uptr kMinimalDistanceFromAnotherGlobal = 64;

Modified: compiler-rt/trunk/lib/asan/lit_tests/global-demangle.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/global-demangle.cc?rev=178458&r1=178457&r2=178458&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/lit_tests/global-demangle.cc (original)
+++ compiler-rt/trunk/lib/asan/lit_tests/global-demangle.cc Mon Apr  1 03:57:38 2013
@@ -4,14 +4,15 @@
 namespace XXX {
 class YYY {
  public:
-  static int ZZZ[];
+  static char ZZZ[];
 };
-int YYY::ZZZ[] = {0, 1, 2, 3};
+char YYY::ZZZ[] = "abc";
 }
 
 int main(int argc, char **argv) {
-  return XXX::YYY::ZZZ[argc + 5];  // BOOM
-  // CHECK: {{READ of size 4 at 0x.*}}
-  // CHECK: {{0x.* is located 8 bytes to the right of global variable}}
-  // CHECK: 'XXX::YYY::ZZZ' {{.*}} of size 16
+  return (int)XXX::YYY::ZZZ[argc + 5];  // BOOM
+  // CHECK: {{READ of size 1 at 0x.*}}
+  // CHECK: {{0x.* is located 2 bytes to the right of global variable}}
+  // CHECK: 'XXX::YYY::ZZZ' {{.*}} of size 4
+  // CHECK: 'XXX::YYY::ZZZ' is ascii string 'abc'
 }





More information about the llvm-commits mailing list