[PATCH] D103426: Clang: Extend format string checking to wprintf/wscanf

Marcus Johnson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 23 22:49:57 PDT 2021


MarcusJohnson91 updated this revision to Diff 361414.
MarcusJohnson91 added a comment.

Getting weird crashes all over the place in code I didn't touch, no idea what's going on


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103426/new/

https://reviews.llvm.org/D103426

Files:
  clang/lib/AST/Expr.cpp
  clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp


Index: clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
+++ clang/lib/StaticAnalyzer/Checkers/CheckSecuritySyntaxOnly.cpp
@@ -782,8 +782,8 @@
   bool BoundsProvided = ArgIndex == DEPR_ONLY;
 
   if (!BoundsProvided) {
-    // Currently we only handle (not wide) string literals. It is possible to do
-    // better, either by looking at references to const variables, or by doing
+    // Currently we only handle string literals. It is possible to do better
+    // either by looking at references to const variables, or by doing
     // real flow analysis.
     auto FormatString =
         dyn_cast<StringLiteral>(CE->getArg(ArgIndex)->IgnoreParenImpCasts());
Index: clang/lib/AST/Expr.cpp
===================================================================
--- clang/lib/AST/Expr.cpp
+++ clang/lib/AST/Expr.cpp
@@ -1068,7 +1068,7 @@
 }
 
 char *StringLiteral::getStrDataAsChar() {
-  std::string Output = "";
+  std::string Output;
   char *CString = nullptr;
   
   switch (getKind()) {
@@ -1078,21 +1078,18 @@
       return getTrailingObjects<char>();
       break;
     case StringKind::UTF16: {
-      std::string Trail16 = "";
-      Trail16             = getTrailingObjects<char>();
-      ArrayRef<char> ArrayRef16(Trail16.c_str(), Trail16.length());
-      if (llvm::convertUTF16ToUTF8String(ArrayRef16, Output)) {
+      ArrayRef<char> AR(getTrailingObjects<char>(), getByteLength());
+      if (llvm::convertUTF16ToUTF8String(AR, Output)) {
         CString = new char[Output.size() + 1]; // +1 for terminating NULL
         return CString;
       }
       break;
     }
     case StringKind::UTF32: {
-      std::string Trail32 = "";
-      Trail32             = getTrailingObjects<char>();
-      ArrayRef<char> ArrayRef32(Trail32.c_str(), Trail32.length());
-      if (llvm::convertUTF32ToUTF8String(ArrayRef32, Output)) {
+      ArrayRef<char> AR(getTrailingObjects<char>(), getByteLength());
+      if (llvm::convertUTF32ToUTF8String(AR, Output)) {
         CString = new char[Output.size() + 1];
+        memcpy(CString, Output.c_str(), Output.size());
         return CString;
       }
       break;
@@ -1100,6 +1097,7 @@
     case StringKind::Wide: {
       if (llvm::convertWideToUTF8(getStringAsWChar(), Output)) {
         CString = new char[Output.size() + 1];
+        memcpy(CString, Output.c_str(), Output.size());
         return CString;
       }
       break;
@@ -1108,8 +1106,7 @@
 }
 
 const char *StringLiteral::getStrDataAsChar() const {
-  const char *ConstString = StringLiteral::getStrDataAsChar();
-  return ConstString;
+  return const_cast<const char*>(getStrDataAsChar());
 }
 
 StringLiteral::StringLiteral(const ASTContext &Ctx, StringRef Str,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103426.361414.patch
Type: text/x-patch
Size: 2835 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210724/55c60af0/attachment-0001.bin>


More information about the llvm-commits mailing list