[cfe-dev] Clang does not rewrite expressions with NULL

Andrey Tarasevich tarasevich.andrey at googlemail.com
Sun Jun 26 15:44:48 PDT 2011


Hello!

I'm currently doing some source-to-source manipulations mainly on C
code. I found a problem with NULL macro. I'm using Ubuntu 10.04 64bit.

Here is a simple code I'm parsing

#include <stdlib.h>

int main()
{
    int n;
    int* p;
    if(p == NULL)
	n = 0;
    else
        n = 1;
}


I initialize the compiler in the following way

void startProcessing(string inFile, string outFile)
{
	auto_ptr<CompilerInstance> compiler(new CompilerInstance);
	compiler->createDiagnostics(0, NULL);

	const char *args[] =
	{
	  "-cc1",
	  "/home/sevich/master/list.c"
	};

	clang::CompilerInvocation::CreateFromArgs(
	  compiler->getInvocation(),
	  args,
	  args + 2,
	  compiler->getDiagnostics());

	llvm::OwningPtr<clang::ASTFrontendAction> action(new ASTMutationAction(inFile,
			outFile));
	compiler->ExecuteAction(*action);
}

The ASTConsumer I use is a modified version of the RewriteOBjC class.
The main work it does is negation of the if statement condition in the
following way

  void RewriteIfStatement(clang::IfStmt *is)
  {
	  Expr* oldCond = is->getCond();
	  ParenExpr* pe = new (context) ParenExpr(is->getLocStart(),
is->getLocEnd(), oldCond);
	  Expr* uo = new (context) UnaryOperator(pe, UO_LNot,
		                                     context->getPointerType(pe->getType()),
											 VK_RValue,
											 OK_Ordinary,
											 SourceLocation());
	  bool result = rewriter.ReplaceStmt(oldCond, uo);
  }

So the problem is whenever I meet the NULL in the if condition it
never gets rewritten. I found out, that source range of the condition
expression with NULL is wrong, for instance It starts with 373 and
ends at 2147677727, what is obviously wrong and rewriter does not do
anything. Clang didn't signalize any errors for this code sample.

So my question is following. Am I doing something wrong or this is a
problem of the clang?

And one more question also. Is it possible to force clang to process
code as C-code? Since I only saw a options for C++ and ObjC.

With best Regards,
Andrey Tarasevich



More information about the cfe-dev mailing list