#67 closed defect (duplicate)

DiOS: VFS Capture does not work

Reported by: Vladimír Štill Owned by: mornfall
Priority: major Milestone: 5.0
Component: other Keywords:


Let's have a program, du.cpp:

#include <dirent.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <string_view>

using namespace std::literals;

void list( std::string entry, std::string name, std::string indent ) {
    std::cout << indent << name << "\n";

    DIR *d = opendir( entry.c_str() );
    if ( d ) {
        struct dirent *dir;
        indent += "    ";
        while ( (dir = readdir( d )) != nullptr ) {
            if ( dir->d_name == "."sv || dir->d_name == ".."sv )
            list( entry + "/" + dir->d_name, dir->d_name, indent );
        closedir( d );

int main() {
    std::string from;
    from.resize( 256 );
    getcwd( from.data(), from.size() );
    list( from, from, "" );

Now, we want to run this program with a VFS capture:

$ divine exec -o nofail:malloc --virtual --capture test/dios/ -std=c++17 du.cpp
compiling du.cpp
FAULT: null pointer dereference: [global* 0 0 ddn]
DOUBLE FAULT: trying to return without a caller
E: Double fault, program terminated.
Segmentation fault

Without capture, this works better:

$ divine exec -o nofail:malloc --virtual -std=c++17 du.cpp
compiling du.cpp
[0] /
encountered an infeasible path (execution cancelled)

Although the last line seems like a bug too.

Change History (1)

comment:1 Changed 13 months ago by mornfall

Resolution: duplicate
Status: newclosed

The problem with --capture is that there is no root directory (i.e. the same problem as described in #31). The example program has a funny bug though, where the std::string has an embedded 0 character in it, leading to infinite recursion with opendir always opening the current working directory. In any case, I'm adding the (fixed) program to the testsuite.

Note: See TracTickets for help on using tickets.