@@ -70,31 +70,22 @@ class OSLogFormatStringHandler
7070 bool HandlePrintfSpecifier (const analyze_printf::PrintfSpecifier &FS,
7171 const char *StartSpecifier, unsigned SpecifierLen,
7272 const TargetInfo &) override {
73- // Set the argument expression. Arguments of struct/class/complex types are
74- // ignored.
75- auto CheckAndSetArgExpr = [&](unsigned Idx, auto &ArgE) {
76- const Expr *E = Args[Idx];
77- if (E && (E->getType ()->isRecordType () || E->getType ()->isComplexType ()))
78- return false ;
79- ArgE = E;
80- return true ;
81- };
82-
8373 if (!FS.consumesDataArgument () &&
8474 FS.getConversionSpecifier ().getKind () !=
8575 clang::analyze_format_string::ConversionSpecifier::PrintErrno)
8676 return true ;
8777
88- ArgData ArgD ;
78+ ArgsData. emplace_back () ;
8979 unsigned ArgIndex = FS.getArgIndex ();
9080 if (ArgIndex < Args.size ())
91- if (!CheckAndSetArgExpr (ArgIndex, ArgD.E ))
92- return true ;
81+ ArgsData.back ().E = Args[ArgIndex];
9382
9483 // First get the Kind
95- ArgD.Kind = getKind (FS.getConversionSpecifier ().getKind ());
96- if (ArgD.Kind != OSLogBufferItem::ErrnoKind && !ArgD.E ) {
84+ ArgsData.back ().Kind = getKind (FS.getConversionSpecifier ().getKind ());
85+ if (ArgsData.back ().Kind != OSLogBufferItem::ErrnoKind &&
86+ !ArgsData.back ().E ) {
9787 // missing argument
88+ ArgsData.pop_back ();
9889 return false ;
9990 }
10091
@@ -106,11 +97,10 @@ class OSLogFormatStringHandler
10697 case clang::analyze_format_string::OptionalAmount::NotSpecified: // "%s"
10798 break ;
10899 case clang::analyze_format_string::OptionalAmount::Constant: // "%.16s"
109- ArgD .Size = precision.getConstantAmount ();
100+ ArgsData. back () .Size = precision.getConstantAmount ();
110101 break ;
111102 case clang::analyze_format_string::OptionalAmount::Arg: // "%.*s"
112- if (!CheckAndSetArgExpr (precision.getArgIndex (), ArgD.Count ))
113- return true ;
103+ ArgsData.back ().Count = Args[precision.getArgIndex ()];
114104 break ;
115105 case clang::analyze_format_string::OptionalAmount::Invalid:
116106 return false ;
@@ -123,11 +113,10 @@ class OSLogFormatStringHandler
123113 case clang::analyze_format_string::OptionalAmount::NotSpecified: // "%P"
124114 return false ; // length must be supplied with pointer format specifier
125115 case clang::analyze_format_string::OptionalAmount::Constant: // "%.16P"
126- ArgD .Size = precision.getConstantAmount ();
116+ ArgsData. back () .Size = precision.getConstantAmount ();
127117 break ;
128118 case clang::analyze_format_string::OptionalAmount::Arg: // "%.*P"
129- if (!CheckAndSetArgExpr (precision.getArgIndex (), ArgD.Count ))
130- return true ;
119+ ArgsData.back ().Count = Args[precision.getArgIndex ()];
131120 break ;
132121 case clang::analyze_format_string::OptionalAmount::Invalid:
133122 return false ;
@@ -136,27 +125,22 @@ class OSLogFormatStringHandler
136125 }
137126 default :
138127 if (FS.getPrecision ().hasDataArgument ()) {
139- if (!CheckAndSetArgExpr (FS.getPrecision ().getArgIndex (),
140- ArgD.Precision ))
141- return true ;
128+ ArgsData.back ().Precision = Args[FS.getPrecision ().getArgIndex ()];
142129 }
143130 break ;
144131 }
145132 if (FS.getFieldWidth ().hasDataArgument ()) {
146- if (!CheckAndSetArgExpr (FS.getFieldWidth ().getArgIndex (),
147- ArgD.FieldWidth ))
148- return true ;
133+ ArgsData.back ().FieldWidth = Args[FS.getFieldWidth ().getArgIndex ()];
149134 }
150135
151136 if (FS.isSensitive ())
152- ArgD .Flags |= OSLogBufferItem::IsSensitive;
137+ ArgsData. back () .Flags |= OSLogBufferItem::IsSensitive;
153138 else if (FS.isPrivate ())
154- ArgD .Flags |= OSLogBufferItem::IsPrivate;
139+ ArgsData. back () .Flags |= OSLogBufferItem::IsPrivate;
155140 else if (FS.isPublic ())
156- ArgD .Flags |= OSLogBufferItem::IsPublic;
141+ ArgsData. back () .Flags |= OSLogBufferItem::IsPublic;
157142
158- ArgD.MaskType = FS.getMaskType ();
159- ArgsData.push_back (ArgD);
143+ ArgsData.back ().MaskType = FS.getMaskType ();
160144 return true ;
161145 }
162146
0 commit comments