[LLVMdev] Strange behavior when converting arrays to strings

Duncan Sands baldrick at free.fr
Wed Jul 28 00:37:20 PDT 2010


Hi Javier,

> I found saw some strange behavior (to me) when converting constant
> arrays to strings. Consider the following example:
>
> std::string Text = "HelloWorld";
>
> unsigned TextLengthBefore = Text.length();
>
> ConstantArray *pArray =
> dyn_cast<ConstantArray>(llvm::ConstantArray::get(pModule->getContext(),
> Text, true));

from Constants.h:

   /// This method constructs a ConstantArray and initializes it with a text
   /// string. The default behavior (AddNull==true) causes a null terminator to
   /// be placed at the end of the array. This effectively increases the length
   /// of the array by one (you've been warned).  However, in some situations
   /// this is not desired so if AddNull==false then the string is copied without
   /// null termination.
   static Constant *get(LLVMContext &Context, StringRef Initializer,
                        bool AddNull = true);

Ciao,

Duncan.

>
> unsigned NumElements = pArray->getNumOperands();
>
> Text = pArray->getAsString();
>
> unsigned TextLengthAfter = Text.length();
>
> After running this example here are the values in each variable:
>
> TextLengthBefore = 10
>
> NumElements = 11
>
> TextLengthAfter = 11
>
> In the conversion from constant array to a string the null terminating
> character is added as part of the string and becomes the 11^th
> character. This becomes a problem when the data is streamed out to a
> buffer because a NULL is inserted in the middle. Below is the code for
> getAsString:
>
> 1: std::string ConstantArray::getAsString() const {
>
> 2: assert(isString() && "Not a string!");
>
> 3: std::string Result;
>
> 4: Result.reserve(getNumOperands());
>
> 5: for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
>
> 6:
> Result.push_back((char)cast<ConstantInt>(getOperand(i))->getZExtValue());
>
> 7: return Result;
>
> 8: }
>
> I think that the loop terminating condition in line 5 should be changed
> from != to <. Does this look right?
>
> Thanks,
>
> Javier
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list