Bug Summary

File:idlc/source/idlccompile.cxx
Location:line 388, column 15
Description:Value stored to 'nErrors' during its initialization is never read

Annotated Source Code

1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <idlc/idlc.hxx>
21#include <rtl/ustring.hxx>
22#include <rtl/strbuf.hxx>
23#include <osl/process.h>
24#include <osl/diagnose.h>
25#include <osl/thread.h>
26#include <osl/file.hxx>
27
28#if defined(SAL_W32)
29#include <io.h>
30#endif
31
32#ifdef SAL_UNX
33#include <errno(*__errno_location ()).h>
34#include <unistd.h>
35#if defined(MACOSX) || defined(FREEBSD) || defined(NETBSD) || \
36 defined(AIX) || defined(OPENBSD) || defined(DRAGONFLY)
37#include <sys/wait.h>
38#else
39#include <wait.h>
40#endif
41#endif
42
43#include <string.h>
44
45using namespace ::rtl;
46using namespace ::osl;
47
48extern int yyparse();
49extern FILE* yyin;
50extern int yydebug;
51
52sal_Int32 lineNumber = 1;
53
54
55static OUString TMP(RTL_CONSTASCII_USTRINGPARAM("TMP")(&("TMP")[0]), ((sal_Int32)((sizeof ("TMP") / sizeof (("TMP"
)[0]))-1)), (((rtl_TextEncoding) 11))
);
56static OUString TEMP(RTL_CONSTASCII_USTRINGPARAM("TEMP")(&("TEMP")[0]), ((sal_Int32)((sizeof ("TEMP") / sizeof ((
"TEMP")[0]))-1)), (((rtl_TextEncoding) 11))
);
57static sal_Char tmpFilePattern[512];
58
59sal_Bool isFileUrl(const OString& fileName)
60{
61 if (fileName.indexOf("file://") == 0 )
62 return sal_True((sal_Bool)1);
63 return sal_False((sal_Bool)0);
64}
65
66OString convertToAbsoluteSystemPath(const OString& fileName)
67{
68 OUString uSysFileName;
69 OUString uFileName(fileName.getStr(), fileName.getLength(), osl_getThreadTextEncoding());
70 if ( isFileUrl(fileName) )
71 {
72 if (FileBase::getSystemPathFromFileURL(uFileName, uSysFileName)
73 != FileBase::E_None)
74 {
75 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "75" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
76 }
77 } else
78 {
79 OUString uWorkingDir, uUrlFileName, uTmp;
80 if (osl_getProcessWorkingDir(&uWorkingDir.pData) != osl_Process_E_None)
81 {
82 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "82" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
83 }
84 if (FileBase::getFileURLFromSystemPath(uFileName, uTmp)
85 != FileBase::E_None)
86 {
87 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "87" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
88 }
89 if (FileBase::getAbsoluteFileURL(uWorkingDir, uTmp, uUrlFileName)
90 != FileBase::E_None)
91 {
92 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "92" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
93 }
94 if (FileBase::getSystemPathFromFileURL(uUrlFileName, uSysFileName)
95 != FileBase::E_None)
96 {
97 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "97" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
98 }
99 }
100
101 return OUStringToOString(uSysFileName, osl_getThreadTextEncoding());
102}
103
104OString convertToFileUrl(const OString& fileName)
105{
106 if ( !isFileUrl(fileName) )
107 {
108 OString tmp = convertToAbsoluteSystemPath(fileName);
109 OUString uFileName(tmp.getStr(), tmp.getLength(), osl_getThreadTextEncoding());
110 OUString uUrlFileName;
111 if (FileBase::getFileURLFromSystemPath(uFileName, uUrlFileName)
112 != FileBase::E_None)
113 {
114 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "114" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
115 }
116 return OUStringToOString(uUrlFileName, osl_getThreadTextEncoding());
117 }
118
119 return fileName;
120}
121
122OString makeTempName(const OString& prefix)
123{
124 OUString uTmpPath;
125 OString tmpPath;
126
127 if ( osl_getEnvironment(TMP.pData, &uTmpPath.pData) != osl_Process_E_None )
128 {
129 if ( osl_getEnvironment(TEMP.pData, &uTmpPath.pData) != osl_Process_E_None )
130 {
131#if defined(SAL_W32)
132 tmpPath = OString("c:\\temp");
133#else
134 tmpPath = OString("/tmp");
135#endif
136 }
137 }
138
139 if ( !uTmpPath.isEmpty() )
140 tmpPath = OUStringToOString(uTmpPath, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76)));
141
142#if defined(SAL_W32) || defined(SAL_UNX)
143
144 OSL_ASSERT( sizeof(tmpFilePattern) >do { if (true && (!(sizeof(tmpFilePattern) > (size_t
) ( tmpPath.getLength() + ((sal_Int32)((sizeof ("/") / sizeof
(("/")[0]))-1)) + prefix.getLength() + ((sal_Int32)((sizeof (
"XXXXXX") / sizeof (("XXXXXX")[0]))-1)) )))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "148" ": "), "OSL_ASSERT: %s", "sizeof(tmpFilePattern) > (size_t) ( tmpPath.getLength() + RTL_CONSTASCII_LENGTH( PATH_SEPARATOR ) + prefix.getLength() + RTL_CONSTASCII_LENGTH( \"XXXXXX\") )"
); } } while (false)
145 (size_t) ( tmpPath.getLength()do { if (true && (!(sizeof(tmpFilePattern) > (size_t
) ( tmpPath.getLength() + ((sal_Int32)((sizeof ("/") / sizeof
(("/")[0]))-1)) + prefix.getLength() + ((sal_Int32)((sizeof (
"XXXXXX") / sizeof (("XXXXXX")[0]))-1)) )))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "148" ": "), "OSL_ASSERT: %s", "sizeof(tmpFilePattern) > (size_t) ( tmpPath.getLength() + RTL_CONSTASCII_LENGTH( PATH_SEPARATOR ) + prefix.getLength() + RTL_CONSTASCII_LENGTH( \"XXXXXX\") )"
); } } while (false)
146 + RTL_CONSTASCII_LENGTH( PATH_SEPARATOR )do { if (true && (!(sizeof(tmpFilePattern) > (size_t
) ( tmpPath.getLength() + ((sal_Int32)((sizeof ("/") / sizeof
(("/")[0]))-1)) + prefix.getLength() + ((sal_Int32)((sizeof (
"XXXXXX") / sizeof (("XXXXXX")[0]))-1)) )))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "148" ": "), "OSL_ASSERT: %s", "sizeof(tmpFilePattern) > (size_t) ( tmpPath.getLength() + RTL_CONSTASCII_LENGTH( PATH_SEPARATOR ) + prefix.getLength() + RTL_CONSTASCII_LENGTH( \"XXXXXX\") )"
); } } while (false)
147 + prefix.getLength()do { if (true && (!(sizeof(tmpFilePattern) > (size_t
) ( tmpPath.getLength() + ((sal_Int32)((sizeof ("/") / sizeof
(("/")[0]))-1)) + prefix.getLength() + ((sal_Int32)((sizeof (
"XXXXXX") / sizeof (("XXXXXX")[0]))-1)) )))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "148" ": "), "OSL_ASSERT: %s", "sizeof(tmpFilePattern) > (size_t) ( tmpPath.getLength() + RTL_CONSTASCII_LENGTH( PATH_SEPARATOR ) + prefix.getLength() + RTL_CONSTASCII_LENGTH( \"XXXXXX\") )"
); } } while (false)
148 + RTL_CONSTASCII_LENGTH( "XXXXXX") ) )do { if (true && (!(sizeof(tmpFilePattern) > (size_t
) ( tmpPath.getLength() + ((sal_Int32)((sizeof ("/") / sizeof
(("/")[0]))-1)) + prefix.getLength() + ((sal_Int32)((sizeof (
"XXXXXX") / sizeof (("XXXXXX")[0]))-1)) )))) { sal_detail_logFormat
((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "148" ": "), "OSL_ASSERT: %s", "sizeof(tmpFilePattern) > (size_t) ( tmpPath.getLength() + RTL_CONSTASCII_LENGTH( PATH_SEPARATOR ) + prefix.getLength() + RTL_CONSTASCII_LENGTH( \"XXXXXX\") )"
); } } while (false)
;
149
150 tmpFilePattern[ sizeof(tmpFilePattern)-1 ] = '\0';
151 strncpy(tmpFilePattern, tmpPath.getStr(), sizeof(tmpFilePattern)-1);
152 strncat(tmpFilePattern, PATH_SEPARATOR"/", sizeof(tmpFilePattern)-1-strlen(tmpFilePattern));
153 strncat(tmpFilePattern, prefix.getStr(), sizeof(tmpFilePattern)-1-strlen(tmpFilePattern));
154 strncat(tmpFilePattern, "XXXXXX", sizeof(tmpFilePattern)-1-strlen(tmpFilePattern));
155
156#ifdef SAL_UNX
157 int nDescriptor = mkstemp(tmpFilePattern);
158 if( -1 == nDescriptor )
159 {
160 fprintf(stderrstderr, "idlc: mkstemp(\"%s\") failed: %s\n", tmpFilePattern, strerror(errno(*__errno_location ())));
161 exit( 1 );
162 }
163 // the file shall later be reopened by stdio functions
164 close( nDescriptor );
165#else
166 (void) mktemp(tmpFilePattern);
167#endif
168#endif
169
170 return OString(tmpFilePattern);
171}
172
173sal_Bool copyFile(const OString* source, const OString& target)
174{
175 sal_Bool bRet = sal_True((sal_Bool)1);
176
177 FILE* pSource = source == 0 ? stdinstdin : fopen(source->getStr(), "rb");
178 if ( !pSource )
179 return sal_False((sal_Bool)0);
180
181 FILE* pTarget = fopen(target.getStr(), "wb");
182 if ( !pTarget )
183 {
184 fclose(pSource);
185 return sal_False((sal_Bool)0);
186 }
187
188 size_t totalSize = 512;
189 size_t readSize = 0;
190 char pBuffer[513];
191
192 while ( !feof(pSource) )
193 {
194 if ( (readSize = fread(pBuffer, 1, totalSize, pSource)) > 0 && !ferror(pSource) )
195 {
196 if ( (fwrite(pBuffer, 1, readSize, pTarget)) != readSize || ferror(pTarget) )
197 {
198 if (source != 0) {
199 fclose(pSource);
200 }
201 fclose(pTarget);
202 return sal_False((sal_Bool)0);
203 }
204 }
205 }
206
207 if (source != 0) {
208 fclose(pSource);
209 }
210 if ( fflush(pTarget) )
211 bRet = sal_False((sal_Bool)0);
212 fclose(pTarget);
213
214 return bRet;
215}
216
217sal_Int32 compileFile(const OString * pathname)
218{
219 // preprocess input file
220 OString tmpFile = makeTempName(OString("idli_"));
221 OString preprocFile = makeTempName(OString("idlf_"));
222
223 OString fileName;
224 if (pathname == 0) {
225 fileName = "stdin";
226 } else {
227 fileName = *pathname;
228 }
229
230 if ( !copyFile(pathname, tmpFile) )
231 {
232 fprintf(stderrstderr, "%s: could not copy %s%s to %s\n",
233 idlc()->getOptions()->getProgramName().getStr(),
234 pathname == 0 ? "" : "file ", fileName.getStr(),
235 tmpFile.getStr());
236 exit(99);
237 }
238
239 idlc()->setFileName(fileName);
240 idlc()->setMainFileName(fileName);
241 idlc()->setRealFileName(tmpFile);
242
243 ::std::vector< ::rtl::OUString> lCppArgs;
244 lCppArgs.push_back("-DIDL");
245 lCppArgs.push_back("-C");
246 lCppArgs.push_back("-zI");
247
248 OStringBuffer cppArgs(256);
249 Options* pOptions = idlc()->getOptions();
250
251 OString filePath;
252 sal_Int32 index = fileName.lastIndexOf(SEPARATOR'/');
253
254 if ( index > 0)
255 {
256 filePath = fileName.copy(0, index);
257
258 if ( !filePath.isEmpty() )
259 {
260 cppArgs.append("-I");
261 cppArgs.append(filePath);
262 lCppArgs.push_back(rtl::OStringToOUString(
263 cppArgs.makeStringAndClear().replace('\\', '/'),
264 RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
265 }
266 }
267
268 if ( pOptions->isValid("-D") )
269 {
270 OString token, dOpt = pOptions->getOption("-D");
271 sal_Int32 nIndex = 0;
272 do
273 {
274 token = dOpt.getToken( 0, ' ', nIndex );
275 if (token.getLength())
276 lCppArgs.push_back(rtl::OStringToOUString("-D" + token, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
277 } while( nIndex != -1 );
278 }
279
280 if ( pOptions->isValid("-I") )
281 {
282 OString token, incOpt = pOptions->getOption("-I");
283 sal_Int32 nIndex = 0;
284 do
285 {
286 token = incOpt.getToken( 0, ' ', nIndex );
287 if (token.getLength())
288 lCppArgs.push_back(rtl::OStringToOUString("-I" + token, RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
289 } while( nIndex != -1 );
290 }
291
292 lCppArgs.push_back(OUString(RTL_CONSTASCII_USTRINGPARAM("-o")(&("-o")[0]), ((sal_Int32)((sizeof ("-o") / sizeof (("-o"
)[0]))-1)), (((rtl_TextEncoding) 11))
));
293
294 cppArgs.append(preprocFile);
295 lCppArgs.push_back(OStringToOUString(cppArgs.makeStringAndClear(), RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
296
297 cppArgs.append(tmpFile);
298 lCppArgs.push_back(OStringToOUString(cppArgs.makeStringAndClear(), RTL_TEXTENCODING_UTF8(((rtl_TextEncoding) 76))));
299
300 OUString cpp;
301 OUString startDir;
302 if (osl_getExecutableFile(&cpp.pData) != osl_Process_E_None) {
303 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "303" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
304 }
305
306 sal_Int32 idx= cpp.lastIndexOf("idlc");
307 cpp = cpp.copy(0, idx);
308
309#if defined(SAL_W32)
310 cpp += OUString( RTL_CONSTASCII_USTRINGPARAM("ucpp.exe")(&("ucpp.exe")[0]), ((sal_Int32)((sizeof ("ucpp.exe") / sizeof
(("ucpp.exe")[0]))-1)), (((rtl_TextEncoding) 11))
);
311#else
312 cpp += OUString( RTL_CONSTASCII_USTRINGPARAM("ucpp")(&("ucpp")[0]), ((sal_Int32)((sizeof ("ucpp") / sizeof ((
"ucpp")[0]))-1)), (((rtl_TextEncoding) 11))
);
313#endif
314
315 oslProcess hProcess = NULL__null;
316 oslProcessError procError = osl_Process_E_None;
317
318 const int nCmdArgs = lCppArgs.size();
319 rtl_uString** pCmdArgs = 0;
320 pCmdArgs = (rtl_uString**)rtl_allocateZeroMemory(nCmdArgs * sizeof(rtl_uString*));
321
322 ::std::vector< ::rtl::OUString >::iterator iter = lCppArgs.begin();
323 ::std::vector< ::rtl::OUString >::iterator end = lCppArgs.end();
324 int i = 0;
325 while ( iter != end ) {
326 pCmdArgs[i++] = (*iter).pData;
327 ++iter;
328 }
329
330 procError = osl_executeProcess( cpp.pData, pCmdArgs, nCmdArgs, osl_Process_WAIT0x0001,
331 0, startDir.pData, 0, 0, &hProcess );
332
333 oslProcessInfo hInfo;
334 hInfo.Size = (sal_uInt32)(sizeof(oslProcessInfo));
335 if (osl_getProcessInfo(hProcess, osl_Process_EXITCODE0x0002, &hInfo)
336 != osl_Process_E_None)
337 {
338 OSL_ASSERT(false)do { if (true && (!(false))) { sal_detail_logFormat((
SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/idlc/source/idlccompile.cxx"
":" "338" ": "), "OSL_ASSERT: %s", "false"); } } while (false
)
;
339 }
340
341 if ( procError || (hInfo.Code != 0) )
342 {
343 if ( procError != osl_Process_E_None )
344 fprintf(stderrstderr, "%s: starting preprocessor failed\n", pOptions->getProgramName().getStr());
345 else
346 fprintf(stderrstderr, "%s: preprocessing %s%s failed\n",
347 pOptions->getProgramName().getStr(),
348 pathname == 0 ? "" : "file ", fileName.getStr());
349
350 osl_freeProcessHandle(hProcess);
351 rtl_freeMemory(pCmdArgs);
352 exit(hInfo.Code ? hInfo.Code : 99);
353 }
354 osl_freeProcessHandle(hProcess);
355 rtl_freeMemory(pCmdArgs);
356
357 if (unlink(tmpFile.getStr()) != 0)
358 {
359 fprintf(stderrstderr, "%s: Could not remove cpp input file %s\n",
360 pOptions->getProgramName().getStr(), tmpFile.getStr());
361 exit(99);
362 }
363
364 if ( pOptions->isValid("-E") )
365 {
366 if (unlink(preprocFile.getStr()) != 0)
367 {
368 fprintf(stderrstderr, "%s: Could not remove parser input file %s\n",
369 pOptions->getProgramName().getStr(), preprocFile.getStr());
370 exit(99);
371 }
372 exit(0);
373 }
374
375 // parse file
376 yyin = fopen(preprocFile.getStr(), "r");
377 if (yyin == NULL__null)
378 {
379 fprintf(stderrstderr, "%s: Could not open cpp output file %s\n",
380 pOptions->getProgramName().getStr(), preprocFile.getStr());
381 exit(99);
382 }
383
384 //yydebug = 0 no trace information
385 //yydebug = 1 parser produce trace information
386 yydebug = 0;
387
388 sal_Int32 nErrors = yyparse();
Value stored to 'nErrors' during its initialization is never read
389 nErrors = idlc()->getErrorCount();
390
391 fclose(yyin);
392 if (unlink(preprocFile.getStr()) != 0)
393 {
394 fprintf(stderrstderr, "%s: Could not remove parser input file %s\n",
395 pOptions->getProgramName().getStr(), preprocFile.getStr());
396 exit(99);
397 }
398
399 return nErrors;
400}
401
402/* vim:set shiftwidth=4 softtabstop=4 expandtab: */