[go: nahoru, domu]

Remove base::SStringPrintf().

Very few callers gained efficiency from this, and removing it will make
converting to absl::StrFormat() easier.

Bug: 1371963
Change-Id: Ie14fc399cc90dfb3dfb991e0a7415b9c933808b1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4772120
Owners-Override: Nico Weber <thakis@chromium.org>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Reviewed-by: Nico Weber <thakis@chromium.org>
Commit-Queue: Nico Weber <thakis@chromium.org>
Auto-Submit: Peter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1183907}
diff --git a/base/strings/stringprintf.cc b/base/strings/stringprintf.cc
index 4ac965a..36a8b41 100644
--- a/base/strings/stringprintf.cc
+++ b/base/strings/stringprintf.cc
@@ -152,38 +152,6 @@
   return result;
 }
 
-const std::string& SStringPrintf(std::string* dst, const char* format, ...) {
-  va_list ap;
-  va_start(ap, format);
-  dst->clear();
-  StringAppendV(dst, format, ap);
-  va_end(ap);
-  return *dst;
-}
-
-#if BUILDFLAG(IS_WIN)
-const std::wstring& SStringPrintf(std::wstring* dst,
-                                  const wchar_t* format, ...) {
-  va_list ap;
-  va_start(ap, format);
-  dst->clear();
-  StringAppendV(dst, format, ap);
-  va_end(ap);
-  return *dst;
-}
-
-const std::u16string& SStringPrintf(std::u16string* dst,
-                                    const char16_t* format,
-                                    ...) {
-  va_list ap;
-  va_start(ap, format);
-  dst->clear();
-  StringAppendV(dst, format, ap);
-  va_end(ap);
-  return *dst;
-}
-#endif
-
 void StringAppendF(std::string* dst, const char* format, ...) {
   va_list ap;
   va_start(ap, format);
diff --git a/base/strings/stringprintf.h b/base/strings/stringprintf.h
index 7894c49..54e55dbdb 100644
--- a/base/strings/stringprintf.h
+++ b/base/strings/stringprintf.h
@@ -21,8 +21,7 @@
 #if BUILDFLAG(IS_WIN)
 // Note: Unfortunately compile time checking of the format string for UTF-16
 // strings is not supported by any compiler, thus these functions should be used
-// carefully and sparingly. Also applies to SStringPrintf and StringAppendV
-// below.
+// carefully and sparingly. Also applies to StringAppendV below.
 [[nodiscard]] BASE_EXPORT std::wstring StringPrintf(const wchar_t* format, ...)
     WPRINTF_FORMAT(1, 2);
 [[nodiscard]] BASE_EXPORT std::u16string StringPrintf(const char16_t* format,
@@ -34,19 +33,6 @@
                                                    va_list ap)
     PRINTF_FORMAT(1, 0);
 
-// Store result into a supplied string and return it.
-BASE_EXPORT const std::string& SStringPrintf(std::string* dst,
-                                             const char* format,
-                                             ...) PRINTF_FORMAT(2, 3);
-#if BUILDFLAG(IS_WIN)
-BASE_EXPORT const std::wstring& SStringPrintf(std::wstring* dst,
-                                              const wchar_t* format,
-                                              ...) WPRINTF_FORMAT(2, 3);
-BASE_EXPORT const std::u16string& SStringPrintf(std::u16string* dst,
-                                                const char16_t* format,
-                                                ...) WPRINTF_FORMAT(2, 3);
-#endif
-
 // Append result to a supplied string.
 BASE_EXPORT void StringAppendF(std::string* dst, const char* format, ...)
     PRINTF_FORMAT(2, 3);
diff --git a/base/strings/stringprintf_unittest.cc b/base/strings/stringprintf_unittest.cc
index 270afe1..bd5da840 100644
--- a/base/strings/stringprintf_unittest.cc
+++ b/base/strings/stringprintf_unittest.cc
@@ -105,22 +105,14 @@
   for (int i = 1; i < 3; i++) {
     src[kSrcLen - i] = 0;
     std::string out;
-    SStringPrintf(&out, "%s", src);
-    EXPECT_STREQ(src, out.c_str());
+    EXPECT_EQ(src, StringPrintf("%s", src));
 
 #if BUILDFLAG(IS_WIN)
     srcw[kSrcLen - i] = 0;
-    std::wstring outw;
-    SStringPrintf(&outw, L"%ls", srcw);
-    EXPECT_STREQ(srcw, outw.c_str());
+    EXPECT_EQ(srcw, StringPrintf(L"%ls", srcw));
 
     src16[kSrcLen - i] = 0;
-    std::u16string out16;
-    SStringPrintf(&out16, u"%ls", src16);
-    // EXPECT_STREQ does not support const char16_t* strings yet.
-    // Dispatch to the const wchar_t* overload instead.
-    EXPECT_STREQ(reinterpret_cast<const wchar_t*>(src16),
-                 reinterpret_cast<const wchar_t*>(out16.c_str()));
+    EXPECT_EQ(src16, StringPrintf(u"%ls", src16));
 #endif
   }
 }
@@ -134,9 +126,6 @@
 
   const char fmt[] = "%sB%sB%sB%sB%sB%sB%s";
 
-  std::string out;
-  SStringPrintf(&out, fmt, src, src, src, src, src, src, src);
-
   const int kRefSize = 320000;
   char* ref = new char[kRefSize];
 #if BUILDFLAG(IS_WIN)
@@ -145,7 +134,7 @@
   snprintf(ref, kRefSize, fmt, src, src, src, src, src, src, src);
 #endif
 
-  EXPECT_STREQ(ref, out.c_str());
+  EXPECT_EQ(ref, StringPrintf(fmt, src, src, src, src, src, src, src));
   delete[] ref;
 }
 
@@ -178,10 +167,7 @@
     src[i] = 'a';
   src[kBufLen - 1] = 0;
 
-  std::string out;
-  SStringPrintf(&out, "%s", src);
-
-  EXPECT_STREQ(src, out.c_str());
+  EXPECT_EQ(src, StringPrintf("%s", src));
 }
 
 #if BUILDFLAG(IS_WIN)
@@ -190,9 +176,7 @@
   invalid[0] = 0xffff;
   invalid[1] = 0;
 
-  std::wstring out;
-  SStringPrintf(&out, L"%ls", invalid);
-  EXPECT_STREQ(invalid, out.c_str());
+  EXPECT_EQ(invalid, StringPrintf(L"%ls", invalid));
 }
 #endif
 
diff --git a/base/trace_event/memory_allocator_dump.cc b/base/trace_event/memory_allocator_dump.cc
index 2dcc8a7a..49ce0136 100644
--- a/base/trace_event/memory_allocator_dump.cc
+++ b/base/trace_event/memory_allocator_dump.cc
@@ -64,7 +64,6 @@
 }
 
 void MemoryAllocatorDump::AsValueInto(TracedValue* value) const {
-  std::string string_conversion_buffer;
   value->BeginDictionaryWithCopiedName(absolute_name_);
   value->SetString("guid", guid_.ToString());
   value->BeginDictionary("attrs");
@@ -73,11 +72,9 @@
     value->BeginDictionaryWithCopiedName(entry.name);
     switch (entry.entry_type) {
       case Entry::kUint64:
-        SStringPrintf(&string_conversion_buffer, "%" PRIx64,
-                      entry.value_uint64);
         value->SetString("type", kTypeScalar);
         value->SetString("units", entry.units);
-        value->SetString("value", string_conversion_buffer);
+        value->SetString("value", StringPrintf("%" PRIx64, entry.value_uint64));
         break;
       case Entry::kString:
         value->SetString("type", kTypeString);
diff --git a/chrome/browser/android/history_report/delta_file_backend_leveldb.cc b/chrome/browser/android/history_report/delta_file_backend_leveldb.cc
index 5f69945..a05f152 100644
--- a/chrome/browser/android/history_report/delta_file_backend_leveldb.cc
+++ b/chrome/browser/android/history_report/delta_file_backend_leveldb.cc
@@ -52,12 +52,9 @@
   entry.set_type(type);
   entry.set_url(url);
   leveldb::WriteOptions writeOptions;
-  std::string key;
-  base::SStringPrintf(&key, "%" PRId64, seq_no);
-  leveldb::Status status = db->Put(
-      writeOptions,
-      leveldb::Slice(key),
-      leveldb::Slice(entry.SerializeAsString()));
+  leveldb::Status status =
+      db->Put(writeOptions, leveldb::Slice(base::NumberToString(seq_no)),
+              leveldb::Slice(entry.SerializeAsString()));
   if (!status.ok())
     LOG(WARNING) << "Save Change failed " << status.ToString();
 }
@@ -162,9 +159,7 @@
     lower_bound = max_seq_no - 1;
   leveldb::WriteBatch updates;
   for (int64_t seq_no = min_seq_no; seq_no <= lower_bound; ++seq_no) {
-    std::string key;
-    base::SStringPrintf(&key, "%" PRId64, seq_no);
-    updates.Delete(leveldb::Slice(key));
+    updates.Delete(leveldb::Slice(base::NumberToString(seq_no)));
   }
 
   leveldb::WriteOptions write_options;
@@ -187,9 +182,7 @@
     entry.set_seq_no(seq_no);
     entry.set_url(*it);
     entry.set_type("add");
-    std::string key;
-    base::SStringPrintf(&key, "%" PRId64, seq_no);
-    updates.Put(leveldb::Slice(key),
+    updates.Put(leveldb::Slice(base::NumberToString(seq_no)),
                 leveldb::Slice(entry.SerializeAsString()));
     ++seq_no;
   }
@@ -206,14 +199,12 @@
     int32_t limit) {
   if (!EnsureInitialized())
     return std::make_unique<std::vector<DeltaFileEntryWithData>>();
-  std::string start;
-  base::SStringPrintf(&start, "%" PRId64, last_seq_no + 1);
   leveldb::ReadOptions options;
   std::unique_ptr<leveldb::Iterator> db_it(db_->NewIterator(options));
-  std::unique_ptr<std::vector<DeltaFileEntryWithData>> result(
-      new std::vector<DeltaFileEntryWithData>());
+  auto result = std::make_unique<std::vector<DeltaFileEntryWithData>>();
   int32_t count = 0;
-  for (db_it->Seek(start); db_it->Valid() && count < limit; db_it->Next()) {
+  for (db_it->Seek(base::NumberToString(last_seq_no + 1));
+       db_it->Valid() && count < limit; db_it->Next()) {
     DeltaFileEntry entry;
     leveldb::Slice value_slice = db_it->value();
     if (!entry.ParseFromArray(value_slice.data(), value_slice.size()))
@@ -261,7 +252,7 @@
     return true;
 
   auto* dump = pmd->CreateAllocatorDump(
-      base::StringPrintf("history/delta_file_service/leveldb_0x%" PRIXPTR,
+      base::StringPrintf("history/delta_file_service/leveldb_%#" PRIXPTR,
                          reinterpret_cast<uintptr_t>(db_.get())));
   dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
                   base::trace_event::MemoryAllocatorDump::kUnitsBytes,
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
index cd2d95c9..0fb9ad1 100644
--- a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
+++ b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
@@ -599,9 +599,8 @@
   // page because the bubble launcher apps grid is scrollable, not paged.
   sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_RIGHT); });
 
-  std::string expected_text;
-  sm_.ExpectSpeech(base::SStringPrintf(
-      &expected_text, "Moved to row 1, column %d.", test_item_index + 2));
+  sm_.ExpectSpeech(
+      base::StringPrintf("Moved to row 1, column %d.", test_item_index + 2));
 
   sm_.Replay();
 }
@@ -627,43 +626,38 @@
   sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_RIGHT); });
   sm_.ExpectNextSpeechIsNot("Alert");
 
-  std::string expected_text;
-  sm_.ExpectSpeech(base::SStringPrintf(&expected_text,
-                                       "Moved to row 1, column %d.",
-                                       column_after_horizontal_move));
+  sm_.ExpectSpeech(base::StringPrintf("Moved to row 1, column %d.",
+                                      column_after_horizontal_move));
 
   // Move the focused item down.
   sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_DOWN); });
   sm_.ExpectNextSpeechIsNot("Alert");
-  sm_.ExpectSpeech(base::SStringPrintf(&expected_text,
-                                       "Moved to row 2, column %d.",
-                                       column_after_horizontal_move));
+  sm_.ExpectSpeech(base::StringPrintf("Moved to row 2, column %d.",
+                                      column_after_horizontal_move));
 
   // Move the focused item down.
   sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_DOWN); });
   sm_.ExpectNextSpeechIsNot("Alert");
-  sm_.ExpectSpeech(base::SStringPrintf(&expected_text,
-                                       "Moved to row 3, column %d.",
-                                       column_after_horizontal_move));
+  sm_.ExpectSpeech(base::StringPrintf("Moved to row 3, column %d.",
+                                      column_after_horizontal_move));
 
   // Move the focused item down.
   sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_DOWN); });
   sm_.ExpectNextSpeechIsNot("Alert");
-  sm_.ExpectSpeech(base::SStringPrintf(&expected_text,
-                                       "Moved to row 4, column %d.",
-                                       column_after_horizontal_move));
+  sm_.ExpectSpeech(base::StringPrintf("Moved to row 4, column %d.",
+                                      column_after_horizontal_move));
 
   // Move the focused item left.
   sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_LEFT); });
   sm_.ExpectNextSpeechIsNot("Alert");
-  sm_.ExpectSpeech(base::SStringPrintf(
-      &expected_text, "Moved to row 4, column %d.", original_column));
+  sm_.ExpectSpeech(
+      base::StringPrintf("Moved to row 4, column %d.", original_column));
 
   // Move the focused item back up.
   sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_UP); });
   sm_.ExpectNextSpeechIsNot("Alert");
-  sm_.ExpectSpeech(base::SStringPrintf(
-      &expected_text, "Moved to row 3, column %d.", original_column));
+  sm_.ExpectSpeech(
+      base::StringPrintf("Moved to row 3, column %d.", original_column));
 
   sm_.Replay();
 }
@@ -693,9 +687,8 @@
   sm_.ExpectSpeech("Button");
   sm_.ExpectNextSpeechIsNot("Alert");
 
-  std::string expected_text;
-  sm_.ExpectSpeech(base::SStringPrintf(
-      &expected_text, "Moved to row 1, column %d.", test_item_index + 1));
+  sm_.ExpectSpeech(
+      base::StringPrintf("Moved to row 1, column %d.", test_item_index + 1));
 
   sm_.Replay();
 }
diff --git a/chrome/browser/extensions/api/proxy/proxy_api.cc b/chrome/browser/extensions/api/proxy/proxy_api.cc
index 5ecb620..0d43a09 100644
--- a/chrome/browser/extensions/api/proxy/proxy_api.cc
+++ b/chrome/browser/extensions/api/proxy/proxy_api.cc
@@ -72,13 +72,10 @@
   base::Value::Dict dict;
   dict.Set(kProxyEventFatalKey, false);
   dict.Set(kProxyEventErrorKey, net::ErrorToString(net::ERR_PAC_SCRIPT_FAILED));
-  std::string error_msg;
+  std::string error_msg = base::UTF16ToUTF8(error);
   if (line_number != -1) {
-    base::SStringPrintf(&error_msg,
-                        "line: %d: %s",
-                        line_number, base::UTF16ToUTF8(error).c_str());
-  } else {
-    error_msg = base::UTF16ToUTF8(error);
+    error_msg =
+        base::StringPrintf("line: %d: %s", line_number, error_msg.c_str());
   }
   dict.Set(kProxyEventDetailsKey, error_msg);
   args.Append(base::Value(std::move(dict)));
diff --git a/chrome/installer/gcapi/gcapi_omaha_experiment.cc b/chrome/installer/gcapi/gcapi_omaha_experiment.cc
index f40ee4e..856bd0a 100644
--- a/chrome/installer/gcapi/gcapi_omaha_experiment.cc
+++ b/chrome/installer/gcapi/gcapi_omaha_experiment.cc
@@ -87,11 +87,9 @@
 
   base::Time instance_time = base::Time::FromTimeT(instance_time_value);
 
-  std::wstring gcapi_experiment_label;
-  base::SStringPrintf(&gcapi_experiment_label, L"%ls=%ls_%d|%ls", label.c_str(),
-                      brand_code, GetCurrentRlzWeek(instance_time),
-                      BuildExperimentDateString(instance_time).c_str());
-  return gcapi_experiment_label;
+  return base::StringPrintf(L"%ls=%ls_%d|%ls", label.c_str(), brand_code,
+                            GetCurrentRlzWeek(instance_time),
+                            BuildExperimentDateString(instance_time).c_str());
 }
 
 }  // namespace gcapi_internals
diff --git a/components/crash/content/app/breakpad_win.cc b/components/crash/content/app/breakpad_win.cc
index 6bffc171..776c39a 100644
--- a/components/crash/content/app/breakpad_win.cc
+++ b/components/crash/content/app/breakpad_win.cc
@@ -186,29 +186,29 @@
 
 // Returns a string containing a list of all modifiers for the loaded profile.
 std::wstring GetProfileType() {
-  std::wstring profile_type;
   DWORD profile_bits = 0;
-  if (::GetProfileType(&profile_bits)) {
-    static const struct {
-      DWORD bit;
-      const wchar_t* name;
-    } kBitNames[] = {
-      { PT_MANDATORY, L"mandatory" },
-      { PT_ROAMING, L"roaming" },
-      { PT_TEMPORARY, L"temporary" },
-    };
-    for (size_t i = 0; i < std::size(kBitNames); ++i) {
-      const DWORD this_bit = kBitNames[i].bit;
-      if ((profile_bits & this_bit) != 0) {
-        profile_type.append(kBitNames[i].name);
-        profile_bits &= ~this_bit;
-        if (profile_bits != 0)
-          profile_type.append(L", ");
+  if (!::GetProfileType(&profile_bits)) {
+    return base::StringPrintf(L"error %u", ::GetLastError());
+  }
+
+  std::wstring profile_type;
+  static const struct {
+    DWORD bit;
+    const wchar_t* name;
+  } kBitNames[] = {
+      {PT_MANDATORY, L"mandatory"},
+      {PT_ROAMING, L"roaming"},
+      {PT_TEMPORARY, L"temporary"},
+  };
+  for (size_t i = 0; i < std::size(kBitNames); ++i) {
+    const DWORD this_bit = kBitNames[i].bit;
+    if ((profile_bits & this_bit) != 0) {
+      profile_type.append(kBitNames[i].name);
+      profile_bits &= ~this_bit;
+      if (profile_bits != 0) {
+        profile_type.append(L", ");
       }
     }
-  } else {
-    DWORD last_error = ::GetLastError();
-    base::SStringPrintf(&profile_type, L"error %u", last_error);
   }
   return profile_type;
 }
diff --git a/components/storage_monitor/volume_mount_watcher_win.cc b/components/storage_monitor/volume_mount_watcher_win.cc
index f3e5372..eb880505b9 100644
--- a/components/storage_monitor/volume_mount_watcher_win.cc
+++ b/components/storage_monitor/volume_mount_watcher_win.cc
@@ -220,7 +220,6 @@
     base::OnceCallback<void(StorageMonitor::EjectStatus)> callback,
     scoped_refptr<base::SequencedTaskRunner> task_runner,
     int iteration) {
-  base::FilePath::StringType volume_name;
   base::FilePath::CharType drive_letter = device.value()[0];
   // Don't try to eject if the path isn't a simple one -- we're not
   // sure how to do that yet. Need to figure out how to eject volumes mounted
@@ -232,7 +231,8 @@
         base::BindOnce(std::move(callback), StorageMonitor::EJECT_FAILURE));
     return;
   }
-  base::SStringPrintf(&volume_name, L"\\\\.\\%lc:", drive_letter);
+  base::FilePath::StringType volume_name =
+      base::StringPrintf(L"\\\\.\\%lc:", drive_letter);
 
   base::win::ScopedHandle volume_handle(CreateFile(
       volume_name.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
diff --git a/content/common/webid/identity_url_loader_throttle_unittest.cc b/content/common/webid/identity_url_loader_throttle_unittest.cc
index f9bc337..0e887e67 100644
--- a/content/common/webid/identity_url_loader_throttle_unittest.cc
+++ b/content/common/webid/identity_url_loader_throttle_unittest.cc
@@ -70,18 +70,16 @@
   throttle->WillStartRequest(&request, &defer);
   EXPECT_FALSE(defer);
 
-  std::string header;
-  if (is_google_header) {
-    base::SStringPrintf(
-        &header,
-        "Google-Accounts-Sign%s: email=\"foo@example.com\", sessionindex=0, "
-        "obfuscatedid=123\n",
-        signin_status == IdpSigninStatus::kSignedIn ? "In" : "Out");
-  } else {
-    base::SStringPrintf(
-        &header, "idp-signin-status: action=sign%s; type=idp; foo=bar",
-        signin_status == IdpSigninStatus::kSignedIn ? "in" : "out-all");
-  }
+  std::string header =
+      is_google_header
+          ? base::StringPrintf(
+                "Google-Accounts-Sign%s: email=\"foo@example.com\", "
+                "sessionindex=0, "
+                "obfuscatedid=123\n",
+                signin_status == IdpSigninStatus::kSignedIn ? "In" : "Out")
+          : base::StringPrintf(
+                "idp-signin-status: action=sign%s; type=idp; foo=bar",
+                signin_status == IdpSigninStatus::kSignedIn ? "in" : "out-all");
 
   network::mojom::URLResponseHead response_head;
   response_head.headers = net::HttpResponseHeaders::TryToCreate(
diff --git a/media/gpu/test/video_frame_file_writer.cc b/media/gpu/test/video_frame_file_writer.cc
index 38a73f0d..5a99338 100644
--- a/media/gpu/test/video_frame_file_writer.cc
+++ b/media/gpu/test/video_frame_file_writer.cc
@@ -146,10 +146,10 @@
     size_t frame_index) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(writer_thread_sequence_checker_);
 
-  base::FilePath::StringType filename;
   const gfx::Size& visible_size = video_frame->visible_rect().size();
-  base::SStringPrintf(&filename, FILE_PATH_LITERAL("frame_%04zu_%dx%d"),
-                      frame_index, visible_size.width(), visible_size.height());
+  base::FilePath::StringType filename =
+      base::StringPrintf(FILE_PATH_LITERAL("frame_%04zu_%dx%d"), frame_index,
+                         visible_size.width(), visible_size.height());
   if (!output_file_prefix_.empty())
     filename = output_file_prefix_ + FILE_PATH_LITERAL("_") + filename;
 
diff --git a/net/cert/x509_util_nss.cc b/net/cert/x509_util_nss.cc
index 77c84a6e8..0cddbb5 100644
--- a/net/cert/x509_util_nss.cc
+++ b/net/cert/x509_util_nss.cc
@@ -72,7 +72,7 @@
   while (SEC_CertNicknameConflict(temp_nickname.c_str(),
                                   const_cast<SECItem*>(subject),
                                   CERT_GetDefaultCertDB())) {
-    base::SStringPrintf(&new_name, "%s #%d", nickname.c_str(), index++);
+    new_name = base::StringPrintf("%s #%d", nickname.c_str(), index++);
     temp_nickname = token_name + new_name;
   }
 
diff --git a/rlz/lib/rlz_lib.cc b/rlz/lib/rlz_lib.cc
index 1114c65..c92e300 100644
--- a/rlz/lib/rlz_lib.cc
+++ b/rlz/lib/rlz_lib.cc
@@ -464,11 +464,9 @@
   if (0 == response_length)
     return true;  // Empty response - no parsing.
 
-  std::string events_variable;
-  std::string stateful_events_variable;
-  base::SStringPrintf(&events_variable, "%s: ", kEventsCgiVariable);
-  base::SStringPrintf(&stateful_events_variable, "%s: ",
-                      kStatefulEventsCgiVariable);
+  std::string events_variable = base::StringPrintf("%s: ", kEventsCgiVariable);
+  std::string stateful_events_variable =
+      base::StringPrintf("%s: ", kStatefulEventsCgiVariable);
 
   int rlz_cgi_length = strlen(kRlzCgiVariable);
 
diff --git a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
index fd4c3305..0322a49 100644
--- a/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
+++ b/services/resource_coordinator/memory_instrumentation/queued_request_dispatcher.cc
@@ -93,8 +93,6 @@
                                 std::vector<base::StringPiece>* path) {
   // Don't dump the root node.
   if (!path->empty()) {
-    std::string string_conversion_buffer;
-
     std::string name = base::JoinString(*path, "/");
     value->BeginDictionaryWithCopiedName(name);
 
@@ -107,10 +105,9 @@
       value->BeginDictionaryWithCopiedName(name_to_entry.first);
       switch (entry.type) {
         case GlobalNodeGraph::Node::Entry::kUInt64:
-          base::SStringPrintf(&string_conversion_buffer, "%" PRIx64,
-                              entry.value_uint64);
           value->SetString("type", RawMemoryGraphNode::kTypeScalar);
-          value->SetString("value", string_conversion_buffer);
+          value->SetString("value",
+                           base::StringPrintf("%" PRIx64, entry.value_uint64));
           break;
         case GlobalNodeGraph::Node::Entry::kString:
           value->SetString("type", RawMemoryGraphNode::kTypeString);
diff --git a/tools/android/memdump/memdump.cc b/tools/android/memdump/memdump.cc
index 9881985d..3b2e6dc 100644
--- a/tools/android/memdump/memdump.cc
+++ b/tools/android/memdump/memdump.cc
@@ -380,7 +380,6 @@
     const std::vector<ProcessMemory>& processes_memory) {
   const int KB_PER_PAGE = kPageSize >> 10;
   std::vector<int> totals_app_shared(processes_memory.size());
-  std::string buf;
   std::cout << "pid\tprivate\t\tshared_app\tshared_other (KB)\n";
   for (std::vector<ProcessMemory>::const_iterator memory_it =
            processes_memory.begin();
@@ -400,19 +399,15 @@
     double total_app_shared = 0;
     for (size_t i = 0; i < totals_app_shared.size(); ++i)
       total_app_shared += static_cast<double>(totals_app_shared[i]) / (i + 2);
-    base::SStringPrintf(
-        &buf, "%d\t%d\t\t%d\t\t%d\n",
-        process_memory.pid,
-        total_private * KB_PER_PAGE,
+    std::cout << base::StringPrintf(
+        "%d\t%d\t\t%d\t\t%d\n", process_memory.pid, total_private * KB_PER_PAGE,
         static_cast<int>(total_app_shared) * KB_PER_PAGE,
         total_other_shared * KB_PER_PAGE);
-    std::cout << buf;
   }
 }
 
 void DumpProcessesMemoryMapsInExtendedFormat(
     const std::vector<ProcessMemory>& processes_memory) {
-  std::string buf;
   std::string app_shared_buf;
   for (std::vector<ProcessMemory>::const_iterator memory_it =
            processes_memory.begin();
@@ -425,15 +420,13 @@
       const MemoryMap& memory_map = *map_it;
       app_shared_buf.clear();
       AppendAppSharedField(memory_map.app_shared_pages, &app_shared_buf);
-      base::SStringPrintf(
-          &buf,
-          "%" PRIx64 "-%" PRIx64 " %s %" PRIx64 " private_unevictable=%d "
+      std::cout << base::StringPrintf(
+          "%" PRIx64 "-%" PRIx64 " %s %" PRIx64
+          " private_unevictable=%d "
           "private=%d shared_app=%s shared_other_unevictable=%d "
           "shared_other=%d \"%s\" [%s]\n",
-          memory_map.start_address,
-          memory_map.end_address,
-          memory_map.flags.c_str(),
-          memory_map.offset,
+          memory_map.start_address, memory_map.end_address,
+          memory_map.flags.c_str(), memory_map.offset,
           memory_map.private_pages.unevictable_count * kPageSize,
           memory_map.private_pages.total_count * kPageSize,
           app_shared_buf.c_str(),
@@ -441,7 +434,6 @@
           memory_map.other_shared_pages.total_count * kPageSize,
           memory_map.name.c_str(),
           memory_map.committed_pages_bits.AsB64String().c_str());
-      std::cout << buf;
     }
   }
 }
diff --git a/ui/events/blink/web_input_event_traits.cc b/ui/events/blink/web_input_event_traits.cc
index cc2fc4b..e0844d87 100644
--- a/ui/events/blink/web_input_event_traits.cc
+++ b/ui/events/blink/web_input_event_traits.cc
@@ -14,7 +14,6 @@
 #include "third_party/blink/public/common/input/web_touch_event.h"
 
 using base::StringAppendF;
-using base::SStringPrintf;
 using blink::WebGestureEvent;
 using blink::WebInputEvent;
 using blink::WebKeyboardEvent;
@@ -107,47 +106,37 @@
       event.rotation_angle, event.tilt_x, event.tilt_y);
 }
 
-struct WebInputEventToString {
-  template <class EventType>
-  bool Execute(const WebInputEvent& event, std::string* result) const {
-    SStringPrintf(result, "%s (Time: %lf, Modifiers: %d)\n",
-                  WebInputEvent::GetName(event.GetType()),
-                  event.TimeStamp().since_origin().InSecondsF(),
-                  event.GetModifiers());
-    const EventType& typed_event = static_cast<const EventType&>(event);
-    ApppendEventDetails(typed_event, result);
-    return true;
-  }
-};
-
-template <typename Operator, typename ArgIn, typename ArgOut>
-bool Apply(Operator op,
-           WebInputEvent::Type type,
-           const ArgIn& arg_in,
-           ArgOut* arg_out) {
-  if (WebInputEvent::IsPointerEventType(type))
-    return op.template Execute<WebPointerEvent>(arg_in, arg_out);
-  else if (WebInputEvent::IsMouseEventType(type))
-    return op.template Execute<WebMouseEvent>(arg_in, arg_out);
-  else if (type == WebInputEvent::Type::kMouseWheel)
-    return op.template Execute<WebMouseWheelEvent>(arg_in, arg_out);
-  else if (WebInputEvent::IsKeyboardEventType(type))
-    return op.template Execute<WebKeyboardEvent>(arg_in, arg_out);
-  else if (WebInputEvent::IsTouchEventType(type))
-    return op.template Execute<WebTouchEvent>(arg_in, arg_out);
-  else if (WebInputEvent::IsGestureEventType(type))
-    return op.template Execute<WebGestureEvent>(arg_in, arg_out);
-
-  NOTREACHED() << "Unknown webkit event type " << type;
-  return false;
+template <typename EventType>
+std::string Execute(const WebInputEvent& event) {
+  std::string result = base::StringPrintf(
+      "%s (Time: %lf, Modifiers: %d)\n",
+      WebInputEvent::GetName(event.GetType()),
+      event.TimeStamp().since_origin().InSecondsF(), event.GetModifiers());
+  ApppendEventDetails(static_cast<const EventType&>(event), &result);
+  return result;
 }
 
 }  // namespace
 
 std::string WebInputEventTraits::ToString(const WebInputEvent& event) {
-  std::string result;
-  Apply(WebInputEventToString(), event.GetType(), event, &result);
-  return result;
+  const WebInputEvent::Type type = event.GetType();
+  if (WebInputEvent::IsPointerEventType(type)) {
+    return Execute<WebPointerEvent>(event);
+  }
+  if (WebInputEvent::IsMouseEventType(type)) {
+    return Execute<WebMouseEvent>(event);
+  }
+  if (type == WebInputEvent::Type::kMouseWheel) {
+    return Execute<WebMouseWheelEvent>(event);
+  }
+  if (WebInputEvent::IsKeyboardEventType(type)) {
+    return Execute<WebKeyboardEvent>(event);
+  }
+  if (WebInputEvent::IsTouchEventType(type)) {
+    return Execute<WebTouchEvent>(event);
+  }
+  CHECK(WebInputEvent::IsGestureEventType(type));
+  return Execute<WebGestureEvent>(event);
 }
 
 bool WebInputEventTraits::ShouldBlockEventStream(const WebInputEvent& event) {