[LLVMdev] Strange behavior when converting arrays to strings

Martinez, Javier E javier.e.martinez at intel.com
Tue Jul 27 17:19:54 PDT 2010


Hi,

I haven't seen a response and I'm curious if I should submit a patch for this.

Thanks,
Javier

From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Martinez, Javier E
Sent: Friday, July 16, 2010 3:20 PM
To: llvmdev at cs.uiuc.edu
Subject: [LLVMdev] Strange behavior when converting arrays to strings

Hello,

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));
  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 11th 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100727/ea19f6c4/attachment.html>


More information about the llvm-dev mailing list