簡體   English   中英

在Ubuntu中獲取分段錯誤(核心轉儲)錯誤

[英]Getting an segmentation fault (core dumped) error in Ubuntu

我正在嘗試構建一個將作為匯編程序運行的程序,它將獲取文件名作為命令行參數並將它們轉換為機器代碼。

程序編譯得很好,並且運行1個文件名,但是當我嘗試運行幾個時,錯誤會在第一次迭代后出現。

我認為可能存在Clear()函數(它刷新了前一次迭代中分配的所有數據),但不確定原因。 請注意,這是部分的,但正如我所說,除非使用多個文件,否則程序將運行。

struct symbolStruct { // a structure which is used to absorb info about a tag, its place in memory and related flags
    char *name;
    int place;
    unsigned int isEntry : 1;
    unsigned int isData : 1;
    unsigned int isExternal : 1;
    struct symbolStruct *next;
};

typedef struct { // a structure which is used to absorb info about the operand structure of an instruction line
    unsigned int numOfOperands : 2;
    unsigned int addrMethSou : 2;
    unsigned int addrMethDest : 2;
    unsigned int operation : 4;
    unsigned int extraWords : 2;
    char *firstOperand;
    char *secondOperand;
} OperandType;

typedef struct {
    unsigned int row : WORD_SIZE;
} int15;

struct MachineCode { // a structure which is used to absorb machine code lines, and their location in the assembly file
    unsigned int row : WORD_SIZE;
    unsigned int line;
    OperandType *structure;
    struct MachineCode *next;
};

struct DataCode { // a structure which is used to absorb data and string elements (signed numbers and ascii characters)
    unsigned int row : WORD_SIZE;
    struct DataCode *next;
};

struct Operation { /* the main operation structure, contains pointers to all used lists, the ic and dc counters, the
    current line number which is dealt with and the error flag. */
    unsigned int ic;
    unsigned int dc;
    struct symbolStruct *externHead; // a pointer to a linked list of extern tags used in the assembly file, and their locations
    struct symbolStruct *symbolHead; // a pointer to a linked list of all tags
    struct DataCode *dataHead; // a pointer to a linked list of all data/string elements
    struct MachineCode *machineHead; // a pointer to a linked list of all machine code rows
    int linenumber;
    unsigned int errorflag : 1; // raised in case of an error which triggered a warning
};

#include "header.h"

void FirstRun(struct Operation*, char *);
void DataUpdate(struct symbolStruct*,int);
void SecondRun(struct Operation *, char *);
void Clear(struct Operation *);

int main(int argc, char *argv[]) {
    int i;
    struct Operation programCore = {0,0,NULL,NULL,NULL,NULL,0,0};
    for(i=1;i<argc;i++) {
        char *fn = argv[i];
        FirstRun(&programCore,fn);
        DataUpdate(programCore.symbolHead,programCore.ic+INSTRUCTION_OFFSET);
        SecondRun(&programCore,fn);
        Clear(&programCore);
        programCore.symbolHead = programCore.externHead = programCore.dataHead = programCore.machineHead = NULL;
    }
    if(argc < 2) {
        fprintf(stderr,"No files selected.\n");
    }
    return 0;
}

/*Used to empty the linked lists and allocated memory after the program has finished one iteration. */
void Clear(struct Operation *programCore) { 
    /*f(pointer name) is there to hold a pointer to the allocated memory which is about to be flushed. */
    struct MachineCode *machineHead = programCore->machineHead, *fMachineHead; 
    struct DataCode *dataHead = programCore->dataHead, *fDataHead; 
        struct symbolStruct *externHead = programCore->externHead, *fExternHead;
    struct symbolStruct *symbolHead = programCore->symbolHead, *fSymbolHead;
    while(machineHead != NULL) {
            fMachineHead = machineHead;
        machineHead = machineHead->next;
        if(fMachineHead->structure != NULL) {
            if(fMachineHead->structure->numOfOperands == 2)
                free(fMachineHead->structure->secondOperand);
            if(fMachineHead->structure->numOfOperands > 0)
                free(fMachineHead->structure->firstOperand);
            free(fMachineHead->structure);
        }
        free(fMachineHead);
    }
    while(dataHead != NULL) {
        fDataHead = dataHead;
        dataHead = dataHead->next;
        free(fDataHead);
    }
    while(externHead != NULL) {
        fExternHead = externHead;
        externHead = externHead->next;
        free(fExternHead->name);
        free(fExternHead);
    }
    while(symbolHead != NULL) {
        fSymbolHead = symbolHead;
        symbolHead = symbolHead->next;
        free(fSymbolHead->name);
        free(fSymbolHead);
    }
    programCore->ic = programCore->dc = programCore->linenumber = programCore->errorflag = 0;
}

您不能釋放和取消上下文結構( programCore )中的鏈接列表。 我懷疑你正在使用指針釋放內存塊。

此行僅復制指針:

struct MachineCode *machineHead = programCore->machineHead;

while()循環不清除programCore->machineHead

要解決它,直接在頭上運行:

while(programCore->machineHead != NULL)
{
    ...
}

好吧,擺脫

   if(fMachineHead->structure->numOfOperands == 2)
         free(fMachineHead->structure->secondOperand);
   if(fMachineHead->structure->numOfOperands > 0)
         free(fMachineHead->structure->firstOperand);

我已設法解決錯誤,但現在我得到一個新的 -

main.c:242:13: error: request for member ‘symbolHead’ in something not a structure or union
main.c:242:38: error: request for member ‘externHead’ in something not a structure or union
main.c:243:13: error: request for member ‘dataHead’ in something not a structure or union
main.c:244:13: error: request for member ‘machineHead’ in something not a structure or union

參考下一行 -

        programCore.symbolHead = programCore.externHead = programCore.dataHead = programCore.machineHead = NULL;

我寫這個的方式有問題嗎? (顯然是的,但我只是沒有看到它)。

再次更改了clear()函數,它現在似乎正常工作。

    /*Used to empty the linked lists and allocated memory after the program has finished one iteration. */
void Clear(struct Operation *programCore) { 
    /*f(pointer name) is there to hold a pointer to the allocated memory which is about to be flushed. */
    struct MachineCode *machineRowPointer = programCore->machineHead, *fMachineRow; 
    struct DataCode *dataRowPointer = programCore->dataHead, *fDataRow; 
        struct symbolStruct *externSymbolPointer = programCore->externHead, *fExtern;
    struct symbolStruct *symbolPointer = programCore->symbolHead, *fSymbol;
    if(machineRowPointer != NULL) {
        while(machineRowPointer != NULL) {
            if(machineRowPointer->structure != NULL)
                free(machineRowPointer->structure);
            fMachineRow = machineRowPointer;
            machineRowPointer = machineRowPointer->next;
            free(fMachineRow);
        }
        programCore->machineHead = NULL;
    }
    if(dataRowPointer != NULL) {
        while(dataRowPointer != NULL) {
            fDataRow = dataRowPointer;
            dataRowPointer = dataRowPointer->next;
            free(fDataRow);
        }
        programCore->dataHead = NULL;
    }
    if(externSymbolPointer != NULL) {
        while(externSymbolPointer != NULL) {
            fExtern = externSymbolPointer;
            externSymbolPointer = externSymbolPointer->next;
            free(fExtern->name);
            free(fExtern);
        }
        programCore->externHead = NULL;
    }
    if(symbolPointer != NULL) {
        while(symbolPointer != NULL) {
            fSymbol = symbolPointer;
            symbolPointer = symbolPointer->next;
            free(fSymbol->name);
            free(fSymbol);
        }
        programCore->symbolHead = NULL;
    }
    programCore->ic = programCore->dc = programCore->linenumber = programCore->errorflag = 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM