<div dir="ltr">Looks like this is old LLVM IR - I don't have an old version of LLVM that can read this. (I only have LLVM from subversion). Not sure what version it is, but if it's not past the upgrade horizon, distributing/sharing bitcode (as LLVM has backwards compatibility guarantees for that) rather than textual IR might be more effective.<br><br>In any case, I'd suggest you try to create a reduced test case that demonstrates the problem. Strip out unrelated instructions, functions, etc, while preserving the IR, and see if it still produces the problem - when you can't strip out anything else without losing the problem, then you have something someone else can more easily look at and explain/understand (equally, by oding this, maybe you find something critical that helps you understand what's going on)<br><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 14, 2018 at 7:22 PM changze cui <<a href="mailto:changzecui@gmail.com">changzecui@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"> Hi Dave,<div>    As you mention, I do use wllvm to do the compilation and extract-bc work. </div><div>    For now, the call graph works fine on CVE-2014-8130 after I recompile the program. I don't know why. It is weird.</div><div>    However, the call graph stll has some problem on CVE-2017-16942. The call graph just miss something.  I follow your advice and I check the IR and find everything is in there. By the way, I also try to recompile the program but don't work.</div><div>    According to the code, the call graph in CVE-2017-16942 is :</div><div>           psf_open_file -> wav_open -> wav_read_header -> wav_w64_read_fmt_chunk (this is the buggy function!)</div><div>    The IR shows the same call relationship (see the attached file 16942.ll).</div><div>    But if I generate the call graph by opt, it will miss   psf_open_file -> wav_open  and   wav_read_header-> wav_w64_read_fmt_chunk. </div><div>    Also, I find some interesting phenomenon. When i generate the call graph, I find some nodes in edge won't show up in nodeList.  So it may looks like   psf_open_file ->  ""    (For now I am using pydot to handle the dot generated by opt).  Maybe the phenomenon is related to the missing call relationship?  I have no idea.</div><div>    I put the dot file and analysis result in the attached file. The dot is generated by opt and the analysis result show the map of caller callee (map[caller]= [callee1 callee2 calee3 ...]).</div><div>    Do you have other idea???</div><div>    Thanks a lot!!!!!!!!</div><div><br></div><div>Regards,</div><div>Chaz</div><div>    </div><br><div class="gmail_quote"><div dir="ltr">David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> 于2018年11月11日周日 上午5:01写道:<br></div></div></div><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Fri, Nov 9, 2018 at 10:39 PM changze cui <<a href="mailto:changzecui@gmail.com" target="_blank">changzecui@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi David,<div>    Thanks for your reply !</div><div>    Actually, I compile the program into an executable program, and I use extract-bc to get .bc file from the executable program.</div></div></blockquote><div><br>I can't say I'd heard of extract-bc - googling around I came across this? <a href="https://github.com/travitch/whole-program-llvm" target="_blank">https://github.com/travitch/whole-program-llvm</a> - is that what you're using? & you built the program with 'wllvm'?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div> Also, I can trigger the CVE from the executable program, which means function TIFFWriteScanLine is inside the executable program. So i think it is one translation unit and the dot-callgraph are supposed to handle this.</div></div></blockquote><div><br>Did you take a look at the LLVM IR (llvm-dis will give you a textual representation of a bitcode file) to make sure everything's in there that you expect to be? Are there function definitions (not only declarations) of all the entities you want in the CFG? Are they calling each other directly, etc?<br><br>- Dave<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>    Do you have other ideas?</div><div><br></div><div>Thanks & Regards,</div><div>Chaz</div></div><br><div class="gmail_quote"><div dir="ltr">David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> 于2018年11月10日周六 上午1:44写道:<br></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">How are you generating the calligraph from? Generally a compiler only acts on a per translation unit basis, so it couldn't form the complete program call graph across multiple files (hence why it's missing the edge that crosses the boundary between .C files)<br><br><div class="gmail_quote"><div dir="ltr">On Thu, Nov 8, 2018, 8:43 AM changze cui via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr">Hi there,<div>   I am working with opt-6.0 and try to generate a call graph of libsndfile, but it seems the call graph doesn't cover all call relationship.</div><div>   Actually, I am doing static analysis on <b>CVE-2014-8130</b>, which is a zero division on libtiff/tif_write.c  TIFFWriteScanline.   (see <a href="https://security-tracker.debian.org/tracker/CVE-2014-8130" target="_blank">https://security-tracker.debian.org/tracker/CVE-2014-8130</a>)</div><div>   Theoretically, the main function in tiffdither.c will call fsdither, and fsdither will call TIFFWriteScanLine.   main (tiffdither.c) -> fsdither (tiffdither.c) -> TIFFWriteScanLine (tif_write.c)</div><div>   I want to get a call graph of the buggy program tiffdither but I find the call graph generated doesn't cover the call relationship from fsdither ->  TIFFWriteScanLine.</div><div>   For short, the call graph now shows TIFFWriteScanLine is only called by an external node.</div><div>   I already compile tiffdither, and I upload it as an attached file. I also write a small python to help analyze the dot file.</div><div>   Actually, I do  opt-6.0 -analyze -dot-callgraph tiffdither.bc to generate the dot file. And then modify the dotPath in dotHandle.py. You can modify the python code to help analyze.</div><div>   I can't figure out why this happens, and I will be very appreciate if you can help!</div><div><br></div><div>Thanks & Regards,</div><div>Chaz</div></div></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>
</blockquote></div></blockquote></div></div>
</blockquote></div></div></blockquote></div></div>