<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style>
<!--
@font-face
        {font-family:Wingdings}
@font-face
        {font-family:Mangal}
@font-face
        {font-family:Mangal}
@font-face
        {font-family:Calibri}
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif"}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline}
a:visited, span.MsoHyperlinkFollowed
        {color:purple;
        text-decoration:underline}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {margin-top:0cm;
        margin-right:0cm;
        margin-bottom:0cm;
        margin-left:36.0pt;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif"}
span.EmailStyle17
        {font-family:"Calibri","sans-serif";
        color:windowtext}
.MsoChpDefault
        {font-family:"Calibri","sans-serif"}
@page WordSection1
        {margin:72.0pt 72.0pt 72.0pt 72.0pt}
div.WordSection1
        {}
ol
        {margin-bottom:0cm}
ul
        {margin-bottom:0cm}
-->
</style>
</head>
<body lang="EN-IN" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">Hi all,</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">I need to know information about callee when a function is called using array of function pointer.</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">I have written following code to get the Callee name using Checker:</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">class SampleEvalCall : public Checker<eval::Call> {</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">public:</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">  bool evalCall(const CallExpr *CE, CheckerContext &C) const {</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    /** Output function name */</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">   llvm::errs() << C.getCalleeName(CE) << “ is called\n“;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">   return false;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">  }</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">};</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">I am getting names for normal function calls but when a function is called using array function pointer, checker does not give any output.</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">Following is the sample program using function pointer where checker fails to give callee name.</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">///////////////////////////////////////////////////////////////////////////////////////////////////</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">#define ARRAY_SIZE1 2</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">#define ARRAY_SIZE2 2</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">#define IDX_00 0</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">#define TRUE 0</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">#define FALSE 1</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">typedef unsigned char U1;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">typedef unsigned short U2;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">typedef struct</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">{</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    U2 mask;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    U1 a;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    U2 (*func_ptr)(void);</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">} STRUCT_1;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">typedef struct</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">{</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    U2 b;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    const STRUCT_1 * struct_ptr;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">} STRUCT_2;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">static U1 ram_var = 1;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">static U1 index_2 = 0;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">U2 func1(void)</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">{</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    return((U2)ram_var);</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">}</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">U2 func2(void)</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">{</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    ram_var = 3;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    return((U2)ram_var);</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">}</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">static const STRUCT_1 array1[ARRAY_SIZE1] =</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">{</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    {</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        (U2)TRUE,</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        (U1)FALSE,</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        &func1</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    },</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">                {</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        (U2)TRUE,</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        (U1)FALSE,</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        &func2</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    }</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">};</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">static const STRUCT_2 array2[ARRAY_SIZE2] =</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">{</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    {</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        (U2)FALSE,</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">        &array1[IDX_00]</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    }</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">};</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">int main()</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">{</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    U2 index_1 = 1;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    U2 ret;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    /* I need to get list of function called by below function pointer. */</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    ret = (*((array2[0].struct_ptr[0].func_ptr)))() &</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">              array2[index_2].struct_ptr[index_1].mask;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">    return (int)ret;</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">}</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">///////////////////////////////////////////////////////////////////////////////////////////////////</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">I understand that checker cannot get the callee name as it will be known at runtime but I need to get</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">the list of all functions that might be called in main function in above program. I need to get ‘func1’ and ‘func2’ function name in above</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">example from checker as a potential callee, one of which will definitely get called at run time.</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">Kindly suggest me a way to get this list.</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">Thanks,</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color:#1F497D">Prashant S. Purohit</span></p>
</div>
This message contains information that may be privileged or confidential and is the property of the KPIT Technologies Ltd. It is intended only for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print,
 retain copy, disseminate, distribute, or use this message or any part thereof. If you receive this message in error, please notify the sender immediately and delete all copies of this message. KPIT Technologies Ltd. does not accept any liability for virus
 infected mails.
</body>
</html>