| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/strings/safe_sprintf.h" | 5 #include "base/strings/safe_sprintf.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <stdio.h> | 9 #include <stdio.h> |
| 10 #include <string.h> | 10 #include <string.h> |
| 11 | 11 |
| 12 #include <limits> | 12 #include <limits> |
| 13 #include <memory> |
| 13 | 14 |
| 14 #include "base/logging.h" | 15 #include "base/logging.h" |
| 15 #include "base/macros.h" | 16 #include "base/macros.h" |
| 16 #include "base/memory/scoped_ptr.h" | |
| 17 #include "build/build_config.h" | 17 #include "build/build_config.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 19 |
| 20 // Death tests on Android are currently very flaky. No need to add more flaky | 20 // Death tests on Android are currently very flaky. No need to add more flaky |
| 21 // tests, as they just make it hard to spot real problems. | 21 // tests, as they just make it hard to spot real problems. |
| 22 // TODO(markus): See if the restrictions on Android can eventually be lifted. | 22 // TODO(markus): See if the restrictions on Android can eventually be lifted. |
| 23 #if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID) | 23 #if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID) |
| 24 #define ALLOW_DEATH_TEST | 24 #define ALLOW_DEATH_TEST |
| 25 #endif | 25 #endif |
| 26 | 26 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 EXPECT_DEATH(SafeSPrintf(buf, "%c%c", 'A'), "cur_arg < max_args"); | 198 EXPECT_DEATH(SafeSPrintf(buf, "%c%c", 'A'), "cur_arg < max_args"); |
| 199 #endif | 199 #endif |
| 200 } | 200 } |
| 201 | 201 |
| 202 TEST(SafeSPrintfTest, ASANFriendlyBufferTest) { | 202 TEST(SafeSPrintfTest, ASANFriendlyBufferTest) { |
| 203 // Print into a buffer that is sized exactly to size. ASAN can verify that | 203 // Print into a buffer that is sized exactly to size. ASAN can verify that |
| 204 // nobody attempts to write past the end of the buffer. | 204 // nobody attempts to write past the end of the buffer. |
| 205 // There is a more complicated test in PrintLongString() that covers a lot | 205 // There is a more complicated test in PrintLongString() that covers a lot |
| 206 // more edge case, but it is also harder to debug in case of a failure. | 206 // more edge case, but it is also harder to debug in case of a failure. |
| 207 const char kTestString[] = "This is a test"; | 207 const char kTestString[] = "This is a test"; |
| 208 scoped_ptr<char[]> buf(new char[sizeof(kTestString)]); | 208 std::unique_ptr<char[]> buf(new char[sizeof(kTestString)]); |
| 209 EXPECT_EQ(static_cast<ssize_t>(sizeof(kTestString) - 1), | 209 EXPECT_EQ(static_cast<ssize_t>(sizeof(kTestString) - 1), |
| 210 SafeSNPrintf(buf.get(), sizeof(kTestString), kTestString)); | 210 SafeSNPrintf(buf.get(), sizeof(kTestString), kTestString)); |
| 211 EXPECT_EQ(std::string(kTestString), std::string(buf.get())); | 211 EXPECT_EQ(std::string(kTestString), std::string(buf.get())); |
| 212 EXPECT_EQ(static_cast<ssize_t>(sizeof(kTestString) - 1), | 212 EXPECT_EQ(static_cast<ssize_t>(sizeof(kTestString) - 1), |
| 213 SafeSNPrintf(buf.get(), sizeof(kTestString), "%s", kTestString)); | 213 SafeSNPrintf(buf.get(), sizeof(kTestString), "%s", kTestString)); |
| 214 EXPECT_EQ(std::string(kTestString), std::string(buf.get())); | 214 EXPECT_EQ(std::string(kTestString), std::string(buf.get())); |
| 215 } | 215 } |
| 216 | 216 |
| 217 TEST(SafeSPrintfTest, NArgs) { | 217 TEST(SafeSPrintfTest, NArgs) { |
| 218 // Pre-C++11 compilers have a different code path, that can only print | 218 // Pre-C++11 compilers have a different code path, that can only print |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 } | 362 } |
| 363 | 363 |
| 364 namespace { | 364 namespace { |
| 365 void PrintLongString(char* buf, size_t sz) { | 365 void PrintLongString(char* buf, size_t sz) { |
| 366 // Output a reasonably complex expression into a limited-size buffer. | 366 // Output a reasonably complex expression into a limited-size buffer. |
| 367 // At least one byte is available for writing the NUL character. | 367 // At least one byte is available for writing the NUL character. |
| 368 CHECK_GT(sz, static_cast<size_t>(0)); | 368 CHECK_GT(sz, static_cast<size_t>(0)); |
| 369 | 369 |
| 370 // Allocate slightly more space, so that we can verify that SafeSPrintf() | 370 // Allocate slightly more space, so that we can verify that SafeSPrintf() |
| 371 // never writes past the end of the buffer. | 371 // never writes past the end of the buffer. |
| 372 scoped_ptr<char[]> tmp(new char[sz+2]); | 372 std::unique_ptr<char[]> tmp(new char[sz + 2]); |
| 373 memset(tmp.get(), 'X', sz+2); | 373 memset(tmp.get(), 'X', sz+2); |
| 374 | 374 |
| 375 // Use SafeSPrintf() to output a complex list of arguments: | 375 // Use SafeSPrintf() to output a complex list of arguments: |
| 376 // - test padding and truncating %c single characters. | 376 // - test padding and truncating %c single characters. |
| 377 // - test truncating %s simple strings. | 377 // - test truncating %s simple strings. |
| 378 // - test mismatching arguments and truncating (for %d != %s). | 378 // - test mismatching arguments and truncating (for %d != %s). |
| 379 // - test zero-padding and truncating %x hexadecimal numbers. | 379 // - test zero-padding and truncating %x hexadecimal numbers. |
| 380 // - test outputting and truncating %d MININT. | 380 // - test outputting and truncating %d MININT. |
| 381 // - test outputting and truncating %p arbitrary pointer values. | 381 // - test outputting and truncating %p arbitrary pointer values. |
| 382 // - test outputting, padding and truncating NULL-pointer %s strings. | 382 // - test outputting, padding and truncating NULL-pointer %s strings. |
| 383 char* out = tmp.get(); | 383 char* out = tmp.get(); |
| 384 size_t out_sz = sz; | 384 size_t out_sz = sz; |
| 385 size_t len; | 385 size_t len; |
| 386 for (scoped_ptr<char[]> perfect_buf;;) { | 386 for (std::unique_ptr<char[]> perfect_buf;;) { |
| 387 size_t needed = SafeSNPrintf(out, out_sz, | 387 size_t needed = SafeSNPrintf(out, out_sz, |
| 388 #if defined(NDEBUG) | 388 #if defined(NDEBUG) |
| 389 "A%2cong %s: %d %010X %d %p%7s", 'l', "string", "", | 389 "A%2cong %s: %d %010X %d %p%7s", 'l', "string", "", |
| 390 #else | 390 #else |
| 391 "A%2cong %s: %%d %010X %d %p%7s", 'l', "string", | 391 "A%2cong %s: %%d %010X %d %p%7s", 'l', "string", |
| 392 #endif | 392 #endif |
| 393 0xDEADBEEF, std::numeric_limits<intptr_t>::min(), | 393 0xDEADBEEF, std::numeric_limits<intptr_t>::min(), |
| 394 PrintLongString, static_cast<char*>(NULL)) + 1; | 394 PrintLongString, static_cast<char*>(NULL)) + 1; |
| 395 | 395 |
| 396 // Various sanity checks: | 396 // Various sanity checks: |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 void *ptr = str; | 754 void *ptr = str; |
| 755 char buf[40]; | 755 char buf[40]; |
| 756 EXPECT_EQ(10, SafeSPrintf(buf, "%p", str)); | 756 EXPECT_EQ(10, SafeSPrintf(buf, "%p", str)); |
| 757 EXPECT_EQ("0x80000000", std::string(buf)); | 757 EXPECT_EQ("0x80000000", std::string(buf)); |
| 758 EXPECT_EQ(10, SafeSPrintf(buf, "%p", ptr)); | 758 EXPECT_EQ(10, SafeSPrintf(buf, "%p", ptr)); |
| 759 EXPECT_EQ("0x80000000", std::string(buf)); | 759 EXPECT_EQ("0x80000000", std::string(buf)); |
| 760 } | 760 } |
| 761 | 761 |
| 762 } // namespace strings | 762 } // namespace strings |
| 763 } // namespace base | 763 } // namespace base |
| OLD | NEW |