• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2010, Google Inc.
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Neither the name of Google Inc. nor the names of its
11  * contributors may be used to endorse or promote products derived from
12  * this software without specific prior written permission.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  * ---
27  * Author: Timur Iskhodzhanov
28  *
29  * This file contains a set of unit tests for memory error detection tools.
30  */
31 
32 #include "test_utils.h"
33 #include "old_test_suite.h"
34 
35 #include <gtest/gtest.h>
36 
37 #ifdef WIN32
38 #include <Wbemidl.h>
39 #pragma comment(lib, "Wbemuuid.lib")
40 #pragma comment(lib, "Ole32.lib")
41 #endif
42 
Noop()43 void Noop() {}
44 
45 namespace NoopTest {
46   REGISTER_TEST(Noop, 0);
47   // Dummy to initialize 'TheMapOfTests'
48 }
49 
TEST(Wrappers,StrchrTest)50 TEST(Wrappers, StrchrTest) {
51   // There were bugs in TSan and Dr. Memory with strchr wrappers.
52   // Fix for TSan bug: http://code.google.com/p/data-race-test/source/diff?spec=svn1641&old=1527&r=1645&format=side&path=/trunk/tsan/ts_replace.h
53   // Dr. Memory bug:   http://code.google.com/p/dynamorio/issues/detail?id=275
54   char foo[8] = {10, 20, 127, (char)128, (char)250, -50, 0};
55   EXPECT_TRUE(strchr(foo, 10) != 0);
56   EXPECT_TRUE(strchr(foo, 127) != 0);
57   EXPECT_TRUE(strchr(foo, 128) != 0);
58   EXPECT_TRUE(strchr(foo, 250) != 0);
59   EXPECT_TRUE(strchr(foo, -50) != 0);
60   EXPECT_TRUE(strchr(foo, -60) == 0);
61   EXPECT_TRUE(strchr(foo, 0) != 0);
62   EXPECT_TRUE(strchr(foo, 0) == foo + strlen(foo));
63 
64   EXPECT_TRUE(strrchr(foo, 10) != 0);
65   EXPECT_TRUE(strrchr(foo, 0) != 0);
66   EXPECT_TRUE(strrchr(foo, 0) == foo + strlen(foo));
67   EXPECT_TRUE(strrchr(foo, 250) != 0);
68   EXPECT_TRUE(strrchr(foo, -60) == 0);
69 
70 #ifdef WIN32
71   EXPECT_TRUE(lstrlenA(NULL) == 0);
72   EXPECT_TRUE(lstrlenW(NULL) == 0);
73 #endif
74   //EXPECT_EQ(
75 }
76 
TEST(Threads,EmptyThreadTest)77 TEST(Threads, EmptyThreadTest) {
78   // DrMemory bug http://code.google.com/p/dynamorio/issues/detail?id=286
79   MyThread mt(Noop);
80   mt.Start();
81   mt.Join();
82 }
83 
84 #ifdef WIN32
TEST(SyscallTests,OutputDebugStringTest)85 TEST(SyscallTests, OutputDebugStringTest) {
86   // DrMemory bug http://code.google.com/p/dynamorio/issues/detail?id=281
87   OutputDebugString("Hello!\n");
88 }
89 
TEST(ComTests,IWbemLocator_ConnectServerTest)90 TEST(ComTests, IWbemLocator_ConnectServerTest) {
91   // DrMemory crashes on this test,
92   // see http://code.google.com/p/drmemory/issues/detail?id=21
93   HRESULT hr;
94   ::CoInitialize(NULL);
95   IWbemLocator *wmi_locator = NULL;
96   hr = ::CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
97                           __uuidof(IWbemLocator),
98                           reinterpret_cast<void**>(&wmi_locator));
99   ASSERT_FALSE(FAILED(hr));
100 
101   printf("before ConnectServer...\n");
102   IWbemServices *wmi_services_r = NULL;
103   hr = wmi_locator->ConnectServer(L"ROOT\\CIMV2", NULL, NULL, 0,
104                                   NULL, 0, 0, &wmi_services_r);
105   printf("after  ConnectServer...\n");
106   EXPECT_FALSE(FAILED(hr));
107 
108   wmi_locator->Release();
109   wmi_services_r->Release();
110   ::CoUninitialize();
111 }
112 
113 namespace HeapTests {
114 class MyMutex {
115  public:
MyMutex()116   MyMutex() {
117     ::InitializeCriticalSectionAndSpinCount(&lock_, 2000);
118   }
~MyMutex()119   ~MyMutex() {
120     ::DeleteCriticalSection(&lock_);
121   }
122  private:
123   CRITICAL_SECTION lock_;
124 };
125 
TEST(HeapTest,MutexAllocatedOnHeapTest)126 TEST(HeapTest, MutexAllocatedOnHeapTest) {
127   MyMutex *m = new MyMutex();
128   delete m;
129 }
130 
131 class MyClass {
132  public:
MyClass(int size)133   explicit MyClass(int size) : ptr_(NULL) {
134     ptr_ = realloc(ptr_, size);
135   }
~MyClass()136   ~MyClass() {
137     free(ptr_);
138   }
139  private:
140   void *ptr_;
141 };
142 
TEST(HeapTest,ReallocInHeapObjectTest)143 TEST(HeapTest, ReallocInHeapObjectTest) {
144   const MyClass m(50031);
145   MyClass *obj = new MyClass(50031);
146   delete obj;
147 }
148 
149 }  // namespace HeapTests
150 
151 #endif
152