See below an interaction I just had with clang_delta. It crashes when run on a variant but then fails to crash when that file is renamed.
Perhaps clang is behaving differently on a .cpp file vs. a file with no extension?
In any case, C-Reduce's current strategy of copying a crash-inducing file into the cwd is going to need to be revised for the case of multi-file reduction. I plan to do this by making a copy of the temp dir where the crash-inducing variant was being evaluated. As a side effect, we'll no longer be renaming files.
John
$ "/home/regehr/creduce-install/libexec/clang_delta" --transformation=remove-nested-function --counter=1 hello.cpp
Segmentation fault (core dumped)
$ "/home/regehr/creduce-install/libexec/clang_delta" --transformation=remove-nested-function --counter=1 creduce_bug_634227
Error: The counter value exceeded the number of transformation instances!
$ diff hello.cpp creduce_bug_634227
$ cat hello.cpp
#include "ostream"
namespace std _GLIBCXX_VISIBILITY(default) {
extern ostream cout;
static ios_base::Init __ioinit;
_GLIBCXX_END_NAMESPACE_VERSION }
int main() {
std::cout << "Hello World!++" << std::endl;
}
$ cat ostream
#include "iosfwd"
#include "exception"
#include "char_traits.h"
#include "localefwd.h"
#include "ios_base.h"
#include "basic_ios.h"
namespace std _GLIBCXX_VISIBILITY(default) {
_GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _CharT, typename _Traits> class basic_ostream : virtual public basic_ios<_CharT, _Traits> {
public: typedef _CharT char_type;
typedef basic_ostream __ostream_type;
__ostream_type& operator<<(__ostream_type& (__ostream_type&)) ;
__ostream_type& put;
__ostream_type& flush;
};
/** * @brief String inserters * @param __out An output stream. * @param __s A character string. * @return out * @pre @p __s must be a non-NULL pointer * * Behaves like one of the formatted arithmetic inserters described in * std::basic_ostream. After constructing a sentry object with good * status, this function inserts @c traits::length characters starting * at @p __s, widened if necessary, followed by any required padding . @c __out.width is then called. */ template<typename _CharT, typename _Traits> inline basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s) {
if (!__s) __out.setstate(ios_base::badbit);
else __ostream_insert(__out, __s, static_cast<streamsize>(_Traits::length(__s)));
return __out;
}
/** * @brief Write a newline and flush the stream. * * This manipulator is often mistakenly used when a simple newline is * desired, leading to poor buffering performance. See * http: * for more on this subject. */ template<typename _CharT, typename _Traits> inline basic_ostream<_CharT, _Traits>& endl(basic_ostream<_CharT, _Traits>& __os) ;
template<typename _CharT, typename _Traits> inline basic_ostream<_CharT, _Traits>& flush(basic_ostream<_CharT, _Traits>& __os) ;
#if __cplusplus >= 201103L
#endif
}