/*
** Splint - annotation-assisted static program checker
-** Copyright (C) 1994-2002 University of Virginia,
+** Copyright (C) 1994-2003 University of Virginia,
** Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
# include "splintMacros.nf"
# include "basic.h"
# include "osd.h"
-# include "portab.h"
/* from stat.h */
/*@ignore@*/
*fullPath == '\0' ||
(*file == CONNECTCHAR || (file[0] != '\0' && file[1] == ':'))
# else
- (*file == CONNECTCHAR)
+ (*file == CONNECTCHAR)
# endif
)
{
/* Path specified. Loop through directories in path looking for the */
/* first occurrence of the file. */
- while (nextdir (&fullPath, &dirPtr, &dirLen) &&
- rVal == OSD_FILENOTFOUND)
+ while (nextdir (&fullPath, &dirPtr, &dirLen)
+ && rVal == OSD_FILENOTFOUND)
{
if ((dirLen + strlen (file) + 2) <= MAXPATHLEN)
{
{
# ifdef UNIX
struct stat buf;
- return (stat (cstring_toCharsSafe (filespec), &buf) == 0);
+ /*@i3@*/ return (stat (cstring_toCharsSafe (filespec), &buf) == 0); /* spurious */
# else
# if defined (WIN32) || defined (OS2)
FILE *test = fileTable_openReadFile (context_fileTable (), filespec);
{
/* mask by file type */
/*@-unrecog@*/ /* S_IFMT is not defined */
- if ((buf.st_mode & S_IFMT) != S_IFDIR /*@=unrecog@*/) /* not a directory */
+ /*@i32@*/ if ((buf.st_mode & S_IFMT) != S_IFDIR /*@=unrecog@*/) /* not a directory */ /* spurious */
{
/* as long as it is an executable file */
# if defined(__IBMC__) && defined(OS2)
| (buf.st_mode & S_IXGRP) |
(buf.st_mode & S_IXOTH)
# endif
- ) != 0);
+ /*@i4@*/ ) != 0); /* spurious */
# endif
}
}
# endif
- return (FALSE);
+ /*@i4@*/ return (FALSE); /* spurious */
}
# endif
}
-# ifdef WIN32
+# if defined (WIN32) || defined (OS2) && defined (__IBMC__)
extern /*@external@*/ int _flushall (void) /*@modifies fileSystem@*/ ;
# endif
{
int res;
/* system ("printenv"); */
-# ifdef WIN32
+# if defined (WIN32) || defined (OS2) && defined (__IBMC__)
(void) _flushall ();
# endif
/*@=redecl@*/
# endif
-static s_tempError = FALSE;
+static bool s_tempError = FALSE;
void osd_setTempError (void)
{
# if defined (WIN32) || defined (OS2) && defined (__IBMC__)
int pid = _getpid ();
# else
- pid_t pid = getpid ();
+ __pid_t pid = getpid ();
# endif
return (int) pid;
{
lldiagmsg (message ("Cannot get working directory: %s\n",
lldecodeerror (errno)));
+ osd_cwd = cstring_makeLiteral ("<missing directory>");
}
else
{
llassert (cstring_isDefined (cwd2));
llassert (cstring_isDefined (filename));
- abs_buffer = (char *) dmalloc (size_fromInt (cstring_length (cwd2) + cstring_length (filename) + 2));
+ abs_buffer = (char *) dmalloc (cstring_length (cwd2) + cstring_length (filename) + 2);
endp = abs_buffer;
/*
cstring osd_outputPath (cstring filename)
{
- /*@i2534 fix this junky code once and for all! */
# if defined (UNIX) || defined (OS2)
char *rel_buffer;
char *rel_buf_p;
rel_buf_p = rel_buffer;
*rel_buf_p = '\0';
+ if (cwd_p == NULL)
+ {
+ /* Need to prevent recursive assertion failures */
+ return cstring_copy (filename);
+ }
+
llassert (cwd_p != NULL);
llassert (path_p != NULL);
}
else
{
- /*@i324 ! splint didn't report an errors for: return ++path_p; */
cstring_free (rel_buffer);
return cstring_fromCharsNew (path_p + 1);
}
}
else
{
+
+ /* drl 2002-10/14 I had to put this code back*/
+ /* the case that needs it is when splint is given an absolute path name of a file outside of the current directory and the subdirectories below the current directory. e.g. cd /home/; splint /tmp/prog.c
+ */
+
/* evans 2002-02-05 This is horrible code, which I've removed. I couldn't find any
** test cases that need it, so I hope I'm not breaking anything.
*/
+ /*#if 0*/
-# if 0
if (*path_p != '\0')
{
--cwd_p;
/* Find out how many directory levels in cwd were *not* matched. */
while (*cwd_p != '\0')
- {s
+ {
if (osd_isConnectChar (*cwd_p++))
unmatched_slash_count++;
}
/* fprintf (stderr, "Returning filename: %s [%p]\n", filename); */
return cstring_copy (filename);
}
-# endif
-
+
+ /*drl 10-14-2002 end previously removed code */
+ /*#endif*/
/* For each of them, put a `../' at the beginning of the short name. */
while (unmatched_slash_count-- > 0)
{
/* Give up if the result gets to be longer
than the absolute path name. */
- if (rel_buffer + filename_len <= rel_buf_p + 3)
+ char * temp_rel_buf_p;
+
+ /*drl This comment is necessary because for some reason Splint
+ does not realize that the pasts where rel_buf_p is released
+ do not reach here*/
+ /*@-usereleased@*/
+ temp_rel_buf_p = rel_buf_p;
+ /*@-usereleased@*/
+
+ if (rel_buffer + filename_len <= temp_rel_buf_p + 3)
{
sfree (rel_buffer);
return cstring_copy (filename);
while ((*rel_buf_p++ = *path_p++) != '\0') ;
- /*@=usereleased@*/ /*@i523! shouldn't need these */
+ /*@=usereleased@*/ /* Splint limitation: shouldn't need these */
--rel_buf_p;
if (osd_isConnectChar (*(rel_buf_p-1)))