158 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- sanitizer_common_printer_test.cc ----------------------------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file is a part of sanitizer_common test suite.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| #include "sanitizer_common/sanitizer_stacktrace_printer.h"
 | |
| 
 | |
| #include "gtest/gtest.h"
 | |
| 
 | |
| namespace __sanitizer {
 | |
| 
 | |
| TEST(SanitizerStacktracePrinter, RenderSourceLocation) {
 | |
|   InternalScopedString str(128);
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, false, "");
 | |
|   EXPECT_STREQ("/dir/file.cc:10:5", str.data());
 | |
| 
 | |
|   str.clear();
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 11, 0, false, "");
 | |
|   EXPECT_STREQ("/dir/file.cc:11", str.data());
 | |
| 
 | |
|   str.clear();
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 0, 0, false, "");
 | |
|   EXPECT_STREQ("/dir/file.cc", str.data());
 | |
| 
 | |
|   str.clear();
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, false, "/dir/");
 | |
|   EXPECT_STREQ("file.cc:10:5", str.data());
 | |
| 
 | |
|   str.clear();
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, true, "");
 | |
|   EXPECT_STREQ("/dir/file.cc(10,5)", str.data());
 | |
| 
 | |
|   str.clear();
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 11, 0, true, "");
 | |
|   EXPECT_STREQ("/dir/file.cc(11)", str.data());
 | |
| 
 | |
|   str.clear();
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 0, 0, true, "");
 | |
|   EXPECT_STREQ("/dir/file.cc", str.data());
 | |
| 
 | |
|   str.clear();
 | |
|   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, true, "/dir/");
 | |
|   EXPECT_STREQ("file.cc(10,5)", str.data());
 | |
| }
 | |
| 
 | |
| TEST(SanitizerStacktracePrinter, RenderModuleLocation) {
 | |
|   InternalScopedString str(128);
 | |
|   RenderModuleLocation(&str, "/dir/exe", 0x123, kModuleArchUnknown, "");
 | |
|   EXPECT_STREQ("(/dir/exe+0x123)", str.data());
 | |
| 
 | |
|   // Check that we strip file prefix if necessary.
 | |
|   str.clear();
 | |
|   RenderModuleLocation(&str, "/dir/exe", 0x123, kModuleArchUnknown, "/dir/");
 | |
|   EXPECT_STREQ("(exe+0x123)", str.data());
 | |
| 
 | |
|   // Check that we render the arch.
 | |
|   str.clear();
 | |
|   RenderModuleLocation(&str, "/dir/exe", 0x123, kModuleArchX86_64H, "/dir/");
 | |
|   EXPECT_STREQ("(exe:x86_64h+0x123)", str.data());
 | |
| }
 | |
| 
 | |
| TEST(SanitizerStacktracePrinter, RenderFrame) {
 | |
|   int frame_no = 42;
 | |
|   AddressInfo info;
 | |
|   info.address = 0x400000;
 | |
|   info.module = internal_strdup("/path/to/my/module");
 | |
|   info.module_offset = 0x200;
 | |
|   info.function = internal_strdup("function_foo");
 | |
|   info.function_offset = 0x100;
 | |
|   info.file = internal_strdup("/path/to/my/source");
 | |
|   info.line = 10;
 | |
|   info.column = 5;
 | |
|   InternalScopedString str(256);
 | |
| 
 | |
|   // Dump all the AddressInfo fields.
 | |
|   RenderFrame(&str, "%% Frame:%n PC:%p Module:%m ModuleOffset:%o "
 | |
|                     "Function:%f FunctionOffset:%q Source:%s Line:%l "
 | |
|                     "Column:%c",
 | |
|               frame_no, info, false, "/path/to/", "function_");
 | |
|   EXPECT_STREQ("% Frame:42 PC:0x400000 Module:my/module ModuleOffset:0x200 "
 | |
|                "Function:foo FunctionOffset:0x100 Source:my/source Line:10 "
 | |
|                "Column:5",
 | |
|                str.data());
 | |
|   info.Clear();
 | |
|   str.clear();
 | |
| 
 | |
|   // Test special format specifiers.
 | |
|   info.address = 0x400000;
 | |
|   RenderFrame(&str, "%M", frame_no, info, false);
 | |
|   EXPECT_NE(nullptr, internal_strstr(str.data(), "400000"));
 | |
|   str.clear();
 | |
| 
 | |
|   RenderFrame(&str, "%L", frame_no, info, false);
 | |
|   EXPECT_STREQ("(<unknown module>)", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.module = internal_strdup("/path/to/module");
 | |
|   info.module_offset = 0x200;
 | |
|   RenderFrame(&str, "%M", frame_no, info, false);
 | |
|   EXPECT_NE(nullptr, internal_strstr(str.data(), "(module+0x"));
 | |
|   EXPECT_NE(nullptr, internal_strstr(str.data(), "200"));
 | |
|   str.clear();
 | |
| 
 | |
|   RenderFrame(&str, "%L", frame_no, info, false);
 | |
|   EXPECT_STREQ("(/path/to/module+0x200)", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.function = internal_strdup("my_function");
 | |
|   RenderFrame(&str, "%F", frame_no, info, false);
 | |
|   EXPECT_STREQ("in my_function", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.function_offset = 0x100;
 | |
|   RenderFrame(&str, "%F %S", frame_no, info, false);
 | |
|   EXPECT_STREQ("in my_function+0x100 <null>", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.file = internal_strdup("my_file");
 | |
|   RenderFrame(&str, "%F %S", frame_no, info, false);
 | |
|   EXPECT_STREQ("in my_function my_file", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.line = 10;
 | |
|   RenderFrame(&str, "%F %S", frame_no, info, false);
 | |
|   EXPECT_STREQ("in my_function my_file:10", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.column = 5;
 | |
|   RenderFrame(&str, "%S %L", frame_no, info, false);
 | |
|   EXPECT_STREQ("my_file:10:5 my_file:10:5", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   RenderFrame(&str, "%S %L", frame_no, info, true);
 | |
|   EXPECT_STREQ("my_file(10,5) my_file(10,5)", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.column = 0;
 | |
|   RenderFrame(&str, "%F %S", frame_no, info, true);
 | |
|   EXPECT_STREQ("in my_function my_file(10)", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.line = 0;
 | |
|   RenderFrame(&str, "%F %S", frame_no, info, true);
 | |
|   EXPECT_STREQ("in my_function my_file", str.data());
 | |
|   str.clear();
 | |
| 
 | |
|   info.Clear();
 | |
| }
 | |
| 
 | |
| }  // namespace __sanitizer
 |