Merge pull request #91 from HeisSpiter/e46c7eb32033b520374e9df8c13bc8589c0602d0
Handle Rtl memory functions in Tokenizer::simplifyMicrosoftMemoryFunctions()
This commit is contained in:
commit
1309825bf1
|
@ -8839,11 +8839,11 @@ void Tokenizer::simplifyMicrosoftMemoryFunctions()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
||||||
if (Token::simpleMatch(tok, "CopyMemory (")) {
|
if (Token::Match(tok, "CopyMemory|RtlCopyMemory|RtlCopyBytes (")) {
|
||||||
tok->str("memcpy");
|
tok->str("memcpy");
|
||||||
} else if (Token::simpleMatch(tok, "MoveMemory (")) {
|
} else if (Token::Match(tok, "MoveMemory|RtlMoveMemory (")) {
|
||||||
tok->str("memmove");
|
tok->str("memmove");
|
||||||
} else if (Token::simpleMatch(tok, "FillMemory (")) {
|
} else if (Token::Match(tok, "FillMemory|RtlFillMemory|RtlFillBytes (")) {
|
||||||
// FillMemory(dst, len, val) -> memset(dst, val, len)
|
// FillMemory(dst, len, val) -> memset(dst, val, len)
|
||||||
tok->str("memset");
|
tok->str("memset");
|
||||||
|
|
||||||
|
@ -8856,7 +8856,7 @@ void Tokenizer::simplifyMicrosoftMemoryFunctions()
|
||||||
if (tok2)
|
if (tok2)
|
||||||
Token::move(tok1->previous(), tok2->tokAt(-2), tok->next()->link()->previous()); // Swap third with second argument
|
Token::move(tok1->previous(), tok2->tokAt(-2), tok->next()->link()->previous()); // Swap third with second argument
|
||||||
}
|
}
|
||||||
} else if (Token::simpleMatch(tok, "ZeroMemory (")) {
|
} else if (Token::Match(tok, "ZeroMemory|RtlZeroMemory|RtlZeroBytes|RtlSecureZeroMemory (")) {
|
||||||
// ZeroMemory(dst, len) -> memset(dst, 0, len)
|
// ZeroMemory(dst, len) -> memset(dst, 0, len)
|
||||||
tok->str("memset");
|
tok->str("memset");
|
||||||
|
|
||||||
|
@ -8870,6 +8870,14 @@ void Tokenizer::simplifyMicrosoftMemoryFunctions()
|
||||||
tok1 = tok1->next();
|
tok1 = tok1->next();
|
||||||
tok1->insertToken(",");
|
tok1->insertToken(",");
|
||||||
}
|
}
|
||||||
|
} else if (Token::simpleMatch(tok, "RtlCompareMemory (")) {
|
||||||
|
// RtlCompareMemory(src1, src2, len) -> memcmp(src1, src2, len)
|
||||||
|
tok->str("memcmp");
|
||||||
|
// For the record, when memcmp returns 0, both strings are equal.
|
||||||
|
// When RtlCompareMemory returns len, both strings are equal.
|
||||||
|
// It might be needed to improve this replacement by something
|
||||||
|
// like ((len - memcmp(src1, src2, len)) % (len + 1)) to
|
||||||
|
// respect execution path (if required)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5966,23 +5966,44 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void microsoftMemory() {
|
void microsoftMemory() {
|
||||||
const char code1[] = "void foo() { int a[10], b[10]; CopyMemory(a, b, sizeof(a)); }";
|
const char code1a[] = "void foo() { int a[10], b[10]; CopyMemory(a, b, sizeof(a)); }";
|
||||||
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memcpy ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code1,false,true,Settings::Win32A));
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memcpy ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code1a,false,true,Settings::Win32A));
|
||||||
|
|
||||||
const char code2[] = "void foo() { int a[10]; FillMemory(a, sizeof(a), 255); }";
|
const char code1b[] = "void foo() { int a[10], b[10]; RtlCopyMemory(a, b, sizeof(a)); }";
|
||||||
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 255 , sizeof ( a ) ) ; }", tokenizeAndStringify(code2,false,true,Settings::Win32A));
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memcpy ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code1b,false,true,Settings::Win32A));
|
||||||
|
|
||||||
const char code3[] = "void foo() { int a[10], b[10]; MoveMemory(a, b, sizeof(a)); }";
|
const char code1c[] = "void foo() { int a[10], b[10]; RtlCopyBytes(a, b, sizeof(a)); }";
|
||||||
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memmove ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code3,false,true,Settings::Win32A));
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memcpy ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code1c,false,true,Settings::Win32A));
|
||||||
|
|
||||||
const char code4[] = "void foo() { int a[10]; ZeroMemory(a, sizeof(a)); }";
|
const char code2a[] = "void foo() { int a[10]; FillMemory(a, sizeof(a), 255); }";
|
||||||
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 0 , sizeof ( a ) ) ; }", tokenizeAndStringify(code4,false,true,Settings::Win32A));
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 255 , sizeof ( a ) ) ; }", tokenizeAndStringify(code2a,false,true,Settings::Win32A));
|
||||||
|
const char code2b[] = "void foo() { int a[10]; RtlFillMemory(a, sizeof(a), 255); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 255 , sizeof ( a ) ) ; }", tokenizeAndStringify(code2b,false,true,Settings::Win32A));
|
||||||
|
const char code2c[] = "void foo() { int a[10]; RtlFillBytes(a, sizeof(a), 255); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 255 , sizeof ( a ) ) ; }", tokenizeAndStringify(code2c,false,true,Settings::Win32A));
|
||||||
|
|
||||||
const char code5[] = "void foo() { ZeroMemory(f(1, g(a, b)), h(i, j(0, 1))); }";
|
const char code3a[] = "void foo() { int a[10], b[10]; MoveMemory(a, b, sizeof(a)); }";
|
||||||
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 0 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code5,false,true,Settings::Win32A));
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memmove ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code3a,false,true,Settings::Win32A));
|
||||||
|
const char code3b[] = "void foo() { int a[10], b[10]; RtlMoveMemory(a, b, sizeof(a)); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memmove ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code3b,false,true,Settings::Win32A));
|
||||||
|
|
||||||
const char code6[] = "void foo() { FillMemory(f(1, g(a, b)), h(i, j(0, 1)), 255); }";
|
const char code4a[] = "void foo() { int a[10]; ZeroMemory(a, sizeof(a)); }";
|
||||||
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 255 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code6,false,true,Settings::Win32A));
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 0 , sizeof ( a ) ) ; }", tokenizeAndStringify(code4a,false,true,Settings::Win32A));
|
||||||
|
const char code4b[] = "void foo() { int a[10]; RtlZeroMemory(a, sizeof(a)); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 0 , sizeof ( a ) ) ; }", tokenizeAndStringify(code4b,false,true,Settings::Win32A));
|
||||||
|
const char code4c[] = "void foo() { int a[10]; RtlZeroBytes(a, sizeof(a)); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 0 , sizeof ( a ) ) ; }", tokenizeAndStringify(code4c,false,true,Settings::Win32A));
|
||||||
|
const char code4d[] = "void foo() { int a[10]; RtlSecureZeroMemory(a, sizeof(a)); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; memset ( a , 0 , sizeof ( a ) ) ; }", tokenizeAndStringify(code4d,false,true,Settings::Win32A));
|
||||||
|
|
||||||
|
const char code5[] = "void foo() { int a[10], b[10]; RtlCompareMemory(a, b, sizeof(a)); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { int a [ 10 ] ; int b [ 10 ] ; memcmp ( a , b , sizeof ( a ) ) ; }", tokenizeAndStringify(code5,false,true,Settings::Win32A));
|
||||||
|
|
||||||
|
const char code6[] = "void foo() { ZeroMemory(f(1, g(a, b)), h(i, j(0, 1))); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 0 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code6,false,true,Settings::Win32A));
|
||||||
|
|
||||||
|
const char code7[] = "void foo() { FillMemory(f(1, g(a, b)), h(i, j(0, 1)), 255); }";
|
||||||
|
ASSERT_EQUALS("void foo ( ) { memset ( f ( 1 , g ( a , b ) ) , 255 , h ( i , j ( 0 , 1 ) ) ) ; }", tokenizeAndStringify(code7,false,true,Settings::Win32A));
|
||||||
}
|
}
|
||||||
|
|
||||||
void borland() {
|
void borland() {
|
||||||
|
|
Loading…
Reference in New Issue