[Soot-list] SourceFileTag overwritten by class name

Marc-André Laverdière marc-andre.laverdiere-papineau at polymtl.ca
Fri Nov 15 16:00:21 EST 2013


Hello Limei,

Thanks for digging down in the code. This looks to me like a real bug.
Would you please put it on Soot's bug tracker in github?

Regards,

Marc-André Laverdière-Papineau
Doctorant - PhD Candidate

On 11/14/2013 01:04 PM, Limei Gilham wrote:
> Hi,
> 
> We have a static analysis tool that builds on top of soot.  The tool 
> needs to be able to access the "SourceFile" attribute in class files.  I 
> found that soot parses the attribute into a SourceFileTag.  But it then 
> overwrites it with the class name (please see the code fragments 
> below).  When a Java source file contains multiple top level classes, 
> the SourceFileTags for the top level classes with names different from 
> the source file name no longer contain the information necessary to 
> access the source file.
> 
> For example, if a java source file Foo.java contains top level classes 
> Foo and Bar, their class files will be named
> 
>    Foo.class and
>    Bar.class
> 
> The "SourceFile" attribute in the class file "Bar.class" contains 
> "Foo.java".  Yet the SourceFileTag for the corresponding SootClass 
> contains "Bar.class".  Is there a reason that soot stores class file 
> name instead of source file name in the SourceFileTag?  Or is this a bug?
> 
> Thanks,
> Limei Gilham
> 
> -----------------------------------------------------------------------------------------
> 
> <soot.CoffiClassSource.java>
>      public Dependencies resolve( SootClass sc ) {
>          ...
>          soot.coffi.Util.v().resolveFromClassFile(sc, classFile, 
> fileName, references);  // creates SourceFileTag using the "SourceFile" 
> attribute in the class file
>          ...
>          addSourceFileTag(sc);  // sets/resets the SourceFileTag to the 
> class name
>          ...
>      }
> 
> <soot.Util.java>
>      public void resolveFromClassFile(SootClass aClass, InputStream is, 
> String filePath, List references) {
>          // Set "SourceFile" attribute tag
>          for(int i = 0; i < coffiClass.attributes_count; i++){
> 
>              if(coffiClass.attributes[i] instanceof SourceFile_attribute){
> 
>                  SourceFile_attribute attr = 
> (SourceFile_attribute)coffiClass.attributes[i];
>                  String sourceFile = 
> ((CONSTANT_Utf8_info)(coffiClass.constant_pool[attr.sourcefile_index])).convert();
> 
>                  if( sourceFile.indexOf(' ') >= 0 ) {
>                      G.v().out.println( "Warning: Class "+className+" 
> has invalid SourceFile attribute (will be ignored)." );
>                  } else {
>                      bclass.addTag(new SourceFileTag( sourceFile , 
> filePath) );  // creates SourceFileTag using the "SourceFile" attribute 
> in the class file
>                  }
> 
>              }
>           ...
> 
> <soot.CoffiClassSource.java>
>       protected void addSourceFileTag(soot.SootClass sc){
>          if (fileName == null && zipFileName == null)
>              return;
> 
>          soot.tagkit.SourceFileTag tag = null;
>          if (sc.hasTag("SourceFileTag")) {
>              tag = (soot.tagkit.SourceFileTag)sc.getTag("SourceFileTag");
>          }
>          else {
>              tag = new soot.tagkit.SourceFileTag();
>              sc.addTag(tag);
>          }
> 
>          String name = zipFileName == null ? new 
> File(fileName).getName() : new File(zipFileName).getName();  // computes 
> the class name
>          tag.setSourceFile(name);   // sets/resets the SourceFileTag to 
> the computed class name
>      }
> 
> _______________________________________________
> Soot-list mailing list
> Soot-list at sable.mcgill.ca
> http://mailman.cs.mcgill.ca/mailman/listinfo/soot-list
> 


More information about the Soot-list mailing list