-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_type_correct.cpp
89 lines (75 loc) · 3.08 KB
/
test_type_correct.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <clang/Tooling/Tooling.h>
#include <llvm/Support/Casting.h>
#include <gtest/gtest.h>
#include <type_correct/TypeCorrectMain.h>
GTEST_TEST(runToolOnCode, StringFunctionReturnType) {
/* Test that var type being assigned to function call is rewritten to match
* function return type */
static const char *const
from = "\n#include <string.h>\n"
"int main(void) { const int n = strlen(\"FOO\"); }\n",
*const want = "\n#include <string.h>\n"
"int main(void) { const size_t n = strlen(\"FOO\"); }\n";
EXPECT_TRUE(clang::tooling::runToolOnCode(
std::make_unique<TypeCorrectPluginAction>(), from));
}
GTEST_TEST(runToolOnCode, ForLoopComparator) {
/* Test that for loop iterator type is rewritten to match comparator's type */
static const char
*const from = "\n#include <string.h>\n"
"int main(void) {\n"
" for(int i=0; i<strlen(\"FOO\"); i++) {}\n"
"}\n",
*const want = "\n#include <string.h>\n"
"int main(void) {\n"
" for(size_t i=0; i<strlen(\"FOO\"); i++) {}\n"
"}\n";
EXPECT_TRUE(clang::tooling::runToolOnCode(
std::make_unique<TypeCorrectPluginAction>(), from));
}
GTEST_TEST(runToolOnCode, FunctionReturnType) {
/* Test that function return type is rewritten to match type being returned */
static const char *const from = "\nint f(long b) { return b; }\n",
*const want = "\nlong f(long b) { return b; }\n";
EXPECT_TRUE(clang::tooling::runToolOnCode(
std::make_unique<TypeCorrectPluginAction>(), from));
}
GTEST_TEST(runToolOnCode, FunctionReturnAndAssignementType) {
/* Test that function return type and global assignment type are rewritten to
* match type being returned */
static const char *const
from = "\nint f(long b) { return b; } static const int c = f(5);\n",
*const want =
"\nlong f(long b) { return b; } static const long c = f(/*b=*/5);\n";
testing::internal::CaptureStderr();
testing::internal::CaptureStdout();
EXPECT_TRUE(clang::tooling::runToolOnCode(
std::make_unique<TypeCorrectPluginAction>(), from));
const std::string output = testing::internal::GetCapturedStderr() +
testing::internal::GetCapturedStdout();
llvm::outs() << "\noutput: \""
<< output /*output.substr(output.rfind('\n')) */
<< "\"\noutput.ends_with(want): "
<< (output.ends_with(want) ? "true" : "false");
}
/* // Annoying edge cases to explicitly ignore to reduce false positives
```c
// Don't modify struct properties, because that could impact too much (and might
be outside project, e.g., in unistd) struct S { int n; } sN;
sN.n = strlen("Foo");
```
```c++
// Ignore when there's an explicit cast
int n = (int)strlen("Foo");
int cppn = static_cast<int>(strlen("Foo"));
```
```c
// Ignore when there's a lot going on
int n;
n = some_int_returning_func();
n = strlen("Foo");
int nn;
nn = some_size_t_returning_func()
nn += strlen("Foo");
```
*/