From 55e86052e0522ac7b51743449055572cc8bc7823 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Mon, 26 Apr 2021 19:32:20 +0200 Subject: Fix issues caused by QCString::rawData and QCString::operator[] - methods were marked const but still returned a non-const reference, cause wrongly optimized code for some platforms/compilers --- libmd5/md5.c | 20 +++++++------------- libmd5/md5.h | 2 +- src/code.l | 9 ++++----- src/configimpl.l | 2 +- src/definition.cpp | 6 +++--- src/dirdef.cpp | 4 ++-- src/docparser.cpp | 18 ++++++++---------- src/dotgraph.cpp | 8 ++++---- src/dotnode.cpp | 37 +++++++++++++++---------------------- src/fortrancode.l | 9 ++++----- src/htmlgen.cpp | 2 +- src/htmlhelp.cpp | 2 +- src/memberdef.cpp | 6 +++--- src/membergroup.cpp | 6 +++--- src/outputgen.cpp | 4 ++-- src/portable.cpp | 2 +- src/portable.h | 2 +- src/portable_c.c | 6 +++--- src/pycode.l | 7 +++---- src/qcstring.h | 20 +++++++++++++++----- src/rtfgen.cpp | 2 +- src/template.cpp | 3 ++- src/util.cpp | 10 +++++----- src/vhdlcode.l | 7 +++---- src/xmlgen.cpp | 4 +--- 25 files changed, 94 insertions(+), 104 deletions(-) diff --git a/libmd5/md5.c b/libmd5/md5.c index d0627ff..1fdcb3a 100644 --- a/libmd5/md5.c +++ b/libmd5/md5.c @@ -31,13 +31,13 @@ MD5Transform(UWORD32 buf[4], UWORD32 const in[16]); int g_bigEndian = 0; int g_endianessDetected = 0; -static void +static void detectEndianess() { int nl = 0x12345678; short ns = 0x1234; - unsigned char *p = (unsigned char *)(&nl); + unsigned char *p = (unsigned char *)(&nl); unsigned char *sp = (unsigned char *)(&ns); if (g_endianessDetected) return; @@ -132,7 +132,7 @@ MD5Update(struct MD5Context *ctx, md5byte const *buf, unsigned len) } /* - * Final wrapup - pad to 64-byte boundary with the bit pattern + * Final wrapup - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void @@ -282,14 +282,13 @@ void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16]) #define HEX_STRING "0123456789abcdef" /* to convert to hex */ -void MD5SigToString(unsigned char signature[16],char *str,int len) +void MD5SigToString(unsigned char signature[16],char str[33]) { unsigned char *sig_p; - char *str_p, *max_p; + char *str_p; unsigned int high, low; str_p = str; - max_p = str + len; for (sig_p = (unsigned char *)signature; sig_p < (unsigned char *)signature + 16; @@ -298,16 +297,11 @@ void MD5SigToString(unsigned char signature[16],char *str,int len) high = *sig_p / 16; low = *sig_p % 16; /* account for 2 chars */ - if (str_p + 1 >= max_p) { - break; - } *str_p++ = HEX_STRING[high]; *str_p++ = HEX_STRING[low]; } - /* account for 2 chars */ - if (str_p < max_p) { - *str_p++ = '\0'; - } + /* account for 1 terminator */ + *str_p++ = '\0'; } diff --git a/libmd5/md5.h b/libmd5/md5.h index 03f8ff6..5d0c0b0 100644 --- a/libmd5/md5.h +++ b/libmd5/md5.h @@ -48,7 +48,7 @@ void MD5Init(struct MD5Context *context); void MD5Update(struct MD5Context *context, md5byte const *buf, unsigned len); void MD5Final(unsigned char digest[16], struct MD5Context *context); void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16]); -void MD5SigToString(unsigned char sig[16],char *str,int len); +void MD5SigToString(unsigned char sig[16],char str[33]); #ifdef __cplusplus } diff --git a/src/code.l b/src/code.l index c8a1dba..ed94853 100644 --- a/src/code.l +++ b/src/code.l @@ -2480,18 +2480,17 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol, tooltip = d->briefDescriptionAsTooltip(); } bool done=FALSE; - char *p=text.rawData(); + const char *p=text.data(); while (!done) { - char *sp=p; + const char *sp=p; char c; while ((c=*p++) && c!='\n') { } if (c=='\n') { yyextra->yyLineNr++; - *(p-1)='\0'; - DBG_CTX((stderr,"writeCodeLink(%s,%s,%s,%s)\n",qPrint(ref),qPrint(file),qPrint(anchor),sp)); - ol.writeCodeLink(ref,file,anchor,QCString(sp),tooltip); + DBG_CTX((stderr,"writeCodeLink(%s,%s,%s,%s)\n",qPrint(ref),qPrint(file),qPrint(anchor),qPrint(QCString(sp,p-sp-1)))); + ol.writeCodeLink(ref,file,anchor,QCString(sp,p-sp-1),tooltip); nextCodeLine(yyscanner); } else diff --git a/src/configimpl.l b/src/configimpl.l index 1285fba..2417336 100644 --- a/src/configimpl.l +++ b/src/configimpl.l @@ -562,7 +562,7 @@ static QCString configStringRecode( } size_t iLeft=(size_t)inputSize; size_t oLeft=(size_t)outputSize; - char *inputPtr = str.rawData(); + const char *inputPtr = str.data(); char *outputPtr = output.rawData(); if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft)) { diff --git a/src/definition.cpp b/src/definition.cpp index e9f479c..a03a676 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -428,17 +428,17 @@ void DefinitionImpl::writeDocAnchorsToTagFile(TextStream &tagFile) const bool DefinitionImpl::_docsAlreadyAdded(const QCString &doc,QCString &sigList) { uchar md5_sig[16]; - QCString sigStr(33); + char sigStr[33]; // to avoid mismatches due to differences in indenting, we first remove // double whitespaces... QCString docStr = doc.simplifyWhiteSpace(); MD5Buffer((const unsigned char *)docStr.data(),docStr.length(),md5_sig); - MD5SigToString(md5_sig,sigStr.rawData(),33); + MD5SigToString(md5_sig,sigStr); //printf("%s:_docsAlreadyAdded doc='%s' sig='%s' docSigs='%s'\n", // qPrint(name()),qPrint(doc),qPrint(sigStr),qPrint(sigList)); if (sigList.find(sigStr)==-1) // new docs, add signature to prevent re-adding it { - sigList+=":"+sigStr; + sigList+=QCString(":")+sigStr; return FALSE; } else diff --git a/src/dirdef.cpp b/src/dirdef.cpp index 72681d9..1814b51 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -178,9 +178,9 @@ static QCString encodeDirName(const QCString &anchor) { // convert to md5 hash uchar md5_sig[16]; - QCString sigStr(33); + char sigStr[33]; MD5Buffer((const unsigned char *)anchor.data(),anchor.length(),md5_sig); - MD5SigToString(md5_sig,sigStr.rawData(),33); + MD5SigToString(md5_sig,sigStr); return sigStr; // old algorithm diff --git a/src/docparser.cpp b/src/docparser.cpp index 23b3729..6e2a6d8 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -275,21 +275,21 @@ static void docParserPopContext(bool keepParamInfo=FALSE) // replaces > with < and > with > within string s static void unescapeCRef(QCString &s) { - QCString tmp(s); - char *p = tmp.rawData(); + QCString result; + const char *p = s.data(); if (p) { char c; - while ((c=*p)) + while ((c=*p++)) { if (c=='{') c='<'; else if (c=='}') c='>'; - *p++=c; + result+=c; } } - tmp=substitute(tmp,"<","<"); - tmp=substitute(tmp,">",">"); - s = tmp; + result=substitute(result,"<","<"); + result=substitute(result,">",">"); + s = result; } //--------------------------------------------------------------------------- @@ -7166,9 +7166,7 @@ static QCString extractCopyDocId(const char *data, uint &j, uint len) j+=9; } e=j; - QCString id(e-s+1); - if (e>s) memcpy(id.rawData(),data+s,e-s); - id.at(e-s)='\0'; + QCString id(data+s,e-s); //printf("extractCopyDocId='%s' input='%s'\n",qPrint(id),&data[s]); return id; } diff --git a/src/dotgraph.cpp b/src/dotgraph.cpp index 6ab34c8..37a1587 100644 --- a/src/dotgraph.cpp +++ b/src/dotgraph.cpp @@ -45,8 +45,8 @@ static bool checkMd5Signature(const QCString &baseName, if (f.is_open()) { // read checksum - QCString md5stored(33); - f.read(md5stored.rawData(),32); + char md5stored[33]; + f.read(md5stored,32); md5stored[32]='\0'; // compare checksum if (!f.fail() && md5==md5stored) @@ -142,12 +142,12 @@ bool DotGraph::prepareDotFile() term("Output dir %s does not exist!\n", m_dir.path().c_str()); } - QCString sigStr(33); + char sigStr[33]; uchar md5_sig[16]; // calculate md5 MD5Buffer((const unsigned char*)m_theGraph.data(), m_theGraph.length(), md5_sig); // convert result to a string - MD5SigToString(md5_sig, sigStr.rawData(), 33); + MD5SigToString(md5_sig, sigStr); // already queued files are processed again in case the output format has changed diff --git a/src/dotnode.cpp b/src/dotnode.cpp index 8dcfaaf..bfc7c08 100644 --- a/src/dotnode.cpp +++ b/src/dotnode.cpp @@ -609,15 +609,13 @@ void DotNode::writeXML(TextStream &t,bool isClassGraph) const if (!m_url.isEmpty()) { QCString url(m_url); - const char *refPtr = url.data(); - char *urlPtr = strchr(url.rawData(),'$'); - if (urlPtr) + int dollarPos = url.find('$'); + if (dollarPos!=-1) { - *urlPtr++='\0'; - t << " 0) { - t << " external=\"" << convertToXML(refPtr) << "\""; + t << " external=\"" << convertToXML(url.left(dollarPos)) << "\""; } t << "/>\n"; } @@ -673,15 +671,13 @@ void DotNode::writeDocbook(TextStream &t,bool isClassGraph) const if (!m_url.isEmpty()) { QCString url(m_url); - const char *refPtr = url.data(); - char *urlPtr = strchr(url.rawData(),'$'); - if (urlPtr) + int dollarPos = url.find('$'); + if (dollarPos!=-1) { - *urlPtr++='\0'; - t << " 0) { - t << " external=\"" << convertToXML(refPtr) << "\""; + t << " external=\"" << convertToXML(url.left(dollarPos)) << "\""; } t << "/>\n"; } @@ -742,18 +738,15 @@ void DotNode::writeDEF(TextStream &t) const if (!m_url.isEmpty()) { QCString url(m_url); - const char *refPtr = url.data(); - char *urlPtr = strchr(url.rawData(),'$'); - if (urlPtr) + int dollarPos = url.find('$'); + if (dollarPos!=-1) { - *urlPtr++='\0'; t << nodePrefix << "link = {\n" << " " - << nodePrefix << "link-id = '" << urlPtr << "';\n"; - - if (*refPtr!='\0') + << nodePrefix << "link-id = '" << url.mid(dollarPos+1) << "';\n"; + if (dollarPos>0) { t << " " << nodePrefix << "link-external = '" - << refPtr << "';\n"; + << url.left(dollarPos) << "';\n"; } t << " };\n"; } diff --git a/src/fortrancode.l b/src/fortrancode.l index 67890e4..c7c4d89 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -1024,24 +1024,23 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol, tooltip = d->briefDescriptionAsTooltip(); } bool done=FALSE; - char *p=text.rawData(); + const char *p=text.data(); while (!done) { - char *sp=p; + const char *sp=p; char c; while ((c=*p++) && c!='\n') { } if (c=='\n') { yyextra->yyLineNr++; - *(p-1)='\0'; //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp); - ol.writeCodeLink(ref,file,anchor,QCString(sp),tooltip); + ol.writeCodeLink(ref,file,anchor,QCString(sp,p-sp-1),tooltip); nextCodeLine(yyscanner); } else { //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp); - ol.writeCodeLink(ref,file,anchor,QCString(sp),tooltip); + ol.writeCodeLink(ref,file,anchor,sp,tooltip); done=TRUE; } } diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 7cd893f..bece962 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -1042,7 +1042,7 @@ static std::mutex g_indexLock; void HtmlGenerator::startFile(const QCString &name,const QCString &, const QCString &title,int id) { - //printf("HtmlGenerator::startFile(%s)\n",name); + //printf("HtmlGenerator::startFile(%s)\n",qPrint(name)); m_relPath = relativePathToRoot(name); QCString fileName = addHtmlExtensionIfMissing(name); m_lastTitle=title; diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp index 05553e1..9887616 100644 --- a/src/htmlhelp.cpp +++ b/src/htmlhelp.cpp @@ -73,7 +73,7 @@ class HtmlHelpRecoder QCString output(oSize); size_t iLeft = iSize; size_t oLeft = oSize; - char *iPtr = s.rawData(); + const char *iPtr = s.data(); char *oPtr = output.rawData(); if (!portable_iconv(m_fromUtf8,&iPtr,&iLeft,&oPtr,&oLeft)) { diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 243f3fb..dc5d095 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -4081,10 +4081,10 @@ void MemberDefImpl::setAnchor() // convert to md5 hash uchar md5_sig[16]; - QCString sigStr(33); + char sigStr[33]; MD5Buffer((const unsigned char *)memAnchor.data(),memAnchor.length(),md5_sig); - MD5SigToString(md5_sig,sigStr.rawData(),33); - m_impl->anc = "a"+sigStr; + MD5SigToString(md5_sig,sigStr); + m_impl->anc = QCString("a")+sigStr; } void MemberDefImpl::setGroupDef(const GroupDef *gd,Grouping::GroupPri_t pri, diff --git a/src/membergroup.cpp b/src/membergroup.cpp index 9f7f6ef..641a317 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -262,12 +262,12 @@ void MemberGroup::setInGroup(bool b) QCString MemberGroup::anchor() const { uchar md5_sig[16]; - QCString sigStr(33); + char sigStr[33]; QCString locHeader = grpHeader; if (locHeader.isEmpty()) locHeader="[NOHEADER]"; MD5Buffer((const unsigned char *)locHeader.data(),locHeader.length(),md5_sig); - MD5SigToString(md5_sig,sigStr.rawData(),33); - return "amgrp"+sigStr; + MD5SigToString(md5_sig,sigStr); + return QCString("amgrp")+sigStr; } void MemberGroup::addListReferences(Definition *def) diff --git a/src/outputgen.cpp b/src/outputgen.cpp index 82c470c..a64bf08 100644 --- a/src/outputgen.cpp +++ b/src/outputgen.cpp @@ -59,12 +59,12 @@ OutputGenerator &OutputGenerator::operator=(const OutputGenerator &og) void OutputGenerator::startPlainFile(const QCString &name) { - //printf("startPlainFile(%s)\n",name); + //printf("startPlainFile(%s)\n",qPrint(name)); m_fileName=m_dir+"/"+name; m_file.open(m_fileName.str(),std::ofstream::out | std::ofstream::binary); if (!m_file.is_open()) { - term("Could not open file %s for writing\n",m_fileName.data()); + term("Could not open file %s for writing\n",qPrint(m_fileName)); } m_t.setStream(&m_file); } diff --git a/src/portable.cpp b/src/portable.cpp index 7448e55..7bcc830 100644 --- a/src/portable.cpp +++ b/src/portable.cpp @@ -607,7 +607,7 @@ size_t Portable::recodeUtf8StringToW(const QCString &inputStr,uint16_t **outBuf) size_t inRemains = len; size_t outRemains = len*sizeof(uint16_t)+2; // chars + \0 const char *p = inputStr.data(); - portable_iconv(handle,(char**)&p,&inRemains,(char**)&buf,&outRemains); + portable_iconv(handle,&p,&inRemains,(char**)&buf,&outRemains); *buf=0; portable_iconv_close(handle); return len; diff --git a/src/portable.h b/src/portable.h index 205f024..d4434b2 100644 --- a/src/portable.h +++ b/src/portable.h @@ -53,7 +53,7 @@ namespace Portable extern "C" { void * portable_iconv_open(const char *tocode, const char *fromcode); - size_t portable_iconv (void *cd, char** inbuf, size_t *inbytesleft, + size_t portable_iconv (void *cd, const char** inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); int portable_iconv_close (void *cd); } diff --git a/src/portable_c.c b/src/portable_c.c index 3a79741..fe81844 100644 --- a/src/portable_c.c +++ b/src/portable_c.c @@ -13,7 +13,7 @@ // These functions are implemented in a C file, because there are different // versions of the iconv() prototype, some with a const pointer and some // without. In C this is just a warning, but in C++ breaks the compilation. -// Looking at the LIBICONV_VERSION is not enough, since for MACOSX the +// Looking at the LIBICONV_VERSION is not enough, since for MACOSX the // const and non-const version exist with the same version of the file. void * portable_iconv_open(const char* tocode, const char* fromcode) @@ -21,10 +21,10 @@ void * portable_iconv_open(const char* tocode, const char* fromcode) return iconv_open(tocode,fromcode); } -size_t portable_iconv (void *cd, char** inbuf, size_t *inbytesleft, +size_t portable_iconv (void *cd, const char** inbuf, size_t *inbytesleft, char** outbuf, size_t *outbytesleft) { - return iconv((iconv_t)cd,inbuf,inbytesleft,outbuf,outbytesleft); + return iconv((iconv_t)cd,(char**)inbuf,inbytesleft,outbuf,outbytesleft); } int portable_iconv_close (void *cd) diff --git a/src/pycode.l b/src/pycode.l index fa65e22..159af1f 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -1108,18 +1108,17 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner, tooltip = d->briefDescriptionAsTooltip(); } bool done=FALSE; - char *p=text.rawData(); + const char *p=text.data(); while (!done) { - char *sp=p; + const char *sp=p; char c; while ((c=*p++) && c!='\n') { } if (c=='\n') { yyextra->yyLineNr++; - *(p-1)='\0'; //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp); - ol.writeCodeLink(ref,file,anchor,sp,tooltip); + ol.writeCodeLink(ref,file,anchor,QCString(sp,p-sp-1),tooltip); nextCodeLine(yyscanner); } else diff --git a/src/qcstring.h b/src/qcstring.h index 1adb4bc..f7cccb7 100644 --- a/src/qcstring.h +++ b/src/qcstring.h @@ -154,7 +154,7 @@ class QCString /** Returns a writable pointer to the data. */ - char *rawData() const { return m_rep.empty() ? 0 : const_cast(&m_rep[0]); } + char *rawData() { return &m_rep[0]; } /** Resizes the string to hold \a newlen characters * (this value should also count the 0-terminator). @@ -436,15 +436,25 @@ class QCString #endif /** Returns a reference to the character at index \a i. */ - char &at( uint i) const + char &at( uint i) { - return const_cast(m_rep[i]); + return m_rep[i]; + } + + const char &at( uint i) const + { + return m_rep[i]; } /** Indexing operator. Equivalent to at(). */ - char &operator[]( int i ) const + char &operator[]( int i ) + { + return m_rep[i]; + } + + const char &operator[]( int i ) const { - return const_cast(m_rep[i]); + return m_rep[i]; } private: diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 8e01a38..0fac0b4 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -2371,7 +2371,7 @@ static void encodeForOutput(TextStream &t,const QCString &s) { size_t iLeft=l; size_t oLeft=enc.size(); - char *inputPtr = (char*)s.data(); + const char *inputPtr = s.data(); char *outputPtr = &enc[0]; if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft)) { diff --git a/src/template.cpp b/src/template.cpp index 9ae2c11..82b35f7 100755 --- a/src/template.cpp +++ b/src/template.cpp @@ -2356,7 +2356,7 @@ QCString TemplateContextImpl::recode(const QCString &s) QCString output(oSize); size_t iLeft = iSize; size_t oLeft = oSize; - char *iPtr = s.rawData(); + const char *iPtr = s.data(); char *oPtr = output.rawData(); if (!portable_iconv(m_fromUtf8,&iPtr,&iLeft,&oPtr,&oLeft)) { @@ -3557,6 +3557,7 @@ static void stripLeadingWhiteSpace(QCString &s) else { *dst++=c; skipSpaces=FALSE; } } *dst='\0'; + s.resize( (int)(dst - src) + 1 ); } } diff --git a/src/util.cpp b/src/util.cpp index 550c7db..4174d42 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -615,7 +615,7 @@ QCString removeRedundantWhiteSpace(const QCString &s) } if (growBuf==0) return s; // should not happen, only we run out of memory - char *src=s.rawData(); + const char *src=s.data(); char *dst=growBuf; uint i=0; @@ -1400,7 +1400,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input) { size_t iLeft=inputSize; size_t oLeft=outputSize; - char *inputPtr = input.rawData(); + const char *inputPtr = input.data(); char *outputPtr = output.rawData(); if (!portable_iconv(cd, &inputPtr, &iLeft, &outputPtr, &oLeft)) { @@ -3760,9 +3760,9 @@ QCString convertNameToFile(const QCString &name,bool allowDots,bool allowUndersc { // third algorithm based on MD5 hash uchar md5_sig[16]; - QCString sigStr(33); + char sigStr[33]; MD5Buffer((const unsigned char *)result.data(),resultLen,md5_sig); - MD5SigToString(md5_sig,sigStr.rawData(),33); + MD5SigToString(md5_sig,sigStr); result=result.left(128-32)+sigStr; } } @@ -6170,7 +6170,7 @@ static int transcodeCharacterBuffer(const QCString &fileName,BufStr &srcBuf,int BufStr tmpBuf(tmpBufSize); size_t iLeft=size; size_t oLeft=tmpBufSize; - char *srcPtr = srcBuf.data(); + const char *srcPtr = srcBuf.data(); char *dstPtr = tmpBuf.data(); uint newSize=0; if (!portable_iconv(cd, &srcPtr, &iLeft, &dstPtr, &oLeft)) diff --git a/src/vhdlcode.l b/src/vhdlcode.l index 1fc1858..8908976 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -1239,18 +1239,17 @@ static void writeMultiLineCodeLink(yyscan_t yyscanner,CodeOutputInterface &ol, tooltip = d->briefDescriptionAsTooltip(); } bool done=false; - char *p=(char *)text.rawData(); + const char *p=text.data(); while (!done) { - char *sp=p; + const char *sp=p; char c; while ((c=*p++) && c!='\n') {} if (c=='\n') { yyextra->yyLineNr++; - *(p-1)='\0'; // printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp); - ol.writeCodeLink(ref,file,anchor,sp,tooltip); + ol.writeCodeLink(ref,file,anchor,QCString(sp,p-sp-1),tooltip); nextCodeLine(yyscanner); } else diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 4e931cd..8489a3c 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -1920,9 +1920,7 @@ void generateXML() int len=static_cast(endLine-startLine); if (len>0) { - QCString s(len+1); - qstrncpy(s.rawData(),startLine,len); - s[len]='\0'; + QCString s(startLine,len); if (s.find("")!=-1) { HtmlEntityMapper::instance()->writeXMLSchema(t); -- cgit v0.12