3131
3232import org .apache .bcel .classfile .Code ;
3333import org .apache .bcel .classfile .Method ;
34+ import org .apache .bcel .generic .Type ;
3435
3536import edu .umd .cs .findbugs .BugReporter ;
3637import edu .umd .cs .findbugs .NonReportingDetector ;
@@ -205,9 +206,7 @@ public Map<MethodDescriptor, int[]> getFileNameStringMethods() {
205206
206207 private int nArgs ;
207208
208- private int shift ;
209-
210- private boolean [] argEnabled ;
209+ private int [] argNums ;
211210
212211 private List <MethodParameter >[] passedParameters ;
213212
@@ -218,30 +217,36 @@ public BuildStringPassthruGraph(BugReporter bugReporter) {
218217 @ SuppressWarnings ("unchecked" )
219218 @ Override
220219 public void visitMethod (Method obj ) {
221- argEnabled = null ;
222- org . apache . bcel . generic . Type [] argumentTypes = obj .getArgumentTypes ();
220+ argNums = null ;
221+ Type [] argumentTypes = obj .getArgumentTypes ();
223222 if (argumentTypes .length == 0 ) {
224223 return ;
225224 }
225+ int lvNum = obj .isStatic () ? 0 : 1 ;
226226 nArgs = argumentTypes .length ;
227+ int argCount = lvNum ;
228+ for (Type type : argumentTypes ) {
229+ argCount +=type .getSize ();
230+ }
227231 for (int i =0 ; i <nArgs ; i ++) {
228232 if (argumentTypes [i ].getSignature ().equals ("Ljava/lang/String;" )) {
229- if (argEnabled == null ) {
230- argEnabled = new boolean [nArgs ];
233+ if (argNums == null ) {
234+ argNums = new int [argCount ];
235+ Arrays .fill (argNums , -1 );
231236 }
232- argEnabled [ i ] = true ;
237+ argNums [ lvNum ] = i ;
233238 }
239+ lvNum +=argumentTypes [i ].getSize ();
234240 }
235- if (argEnabled != null ) {
236- shift = obj .isStatic () ? 0 : -1 ;
241+ if (argNums != null ) {
237242 passedParameters = new List [nArgs ];
238243 }
239244 super .visitMethod (obj );
240245 }
241246
242247 @ Override
243248 public boolean shouldVisitCode (Code obj ) {
244- return argEnabled != null ;
249+ return argNums != null ;
245250 }
246251
247252 @ Override
@@ -261,10 +266,13 @@ public void visitAfter(Code obj) {
261266 @ Override
262267 public void sawOpcode (int seen ) {
263268 if (isRegisterStore ()) {
264- int param = getRegisterOperand () + shift ;
265- if (param >= 0 && param < nArgs ) {
266- argEnabled [param ] = false ;
267- passedParameters [param ] = null ;
269+ int param = getRegisterOperand ();
270+ if (param < argNums .length ) {
271+ int argNum = argNums [param ];
272+ argNums [param ] = -1 ;
273+ if (argNum >= 0 ) {
274+ passedParameters [argNum ] = null ;
275+ }
268276 }
269277 }
270278 switch (seen ) {
@@ -276,11 +284,11 @@ public void sawOpcode(int seen) {
276284 int callArgs = getNumberArguments (md .getSignature ());
277285 for (int i = 0 ; i < callArgs ; i ++) {
278286 Item item = getStack ().getStackItem (callArgs - 1 - i );
279- int param = item .getRegisterNumber () + shift ;
280- if (param >= 0 && param < nArgs && argEnabled [param ]) {
281- List <MethodParameter > list = passedParameters [param ];
287+ int param = item .getRegisterNumber ();
288+ if (param >= 0 && param < argNums . length && argNums [param ] != - 1 ) {
289+ List <MethodParameter > list = passedParameters [argNums [ param ] ];
282290 if (list == null ) {
283- passedParameters [param ] = list = new ArrayList <>();
291+ passedParameters [argNums [ param ] ] = list = new ArrayList <>();
284292 }
285293 list .add (new MethodParameter (md , i ));
286294 }
0 commit comments