You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含pthreads的C语言循环出现Segmentation fault问题求助

多线程暴力破解密码代码段错误修复方案

常见问题及修复点:

  • 内存越界(最可能的元凶)
    新手常踩的坑:定义密码缓冲区时没给字符串终止符'\0'留位置。比如要破解4位密码,却只写char guess[4]——存4个字符后没地方放终止符,strcmp这类函数访问时直接越界踩内存,触发段错。
    修复:把缓冲区大小设为目标密码长度+1,比如目标密码是6位,就写char guess[7] = {0};,用{0}初始化清空所有元素,避免残留垃圾值干扰字符串处理。

  • 线程参数生命周期问题
    如果给pthread_create传递栈上的临时变量指针(比如循环里传&i),线程启动时这个变量可能已经被销毁或值被覆盖,访问就会出错。
    修复:用malloc给线程参数分配堆内存(比如封装成结构体),线程结束后记得free;或者用全局数组存储参数,确保线程运行期间参数始终有效。

  • ASCII遍历的边界错误
    直接遍历全ASCII(0-127)会包含大量不可打印字符,不仅没用,还可能导致字符串处理函数异常,或超出预设字符集范围引发越界。
    修复:直接定义合法字符集,比如只遍历大小写字母+数字:

    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    int charset_len = strlen(charset);
    // 遍历的时候用charset[index]取字符,别直接用ASCII值硬怼
    
  • 共享资源未同步
    多个线程同时修改全局变量(比如破解成功的标记found),会引发竞态条件,严重时直接导致内存访问错误。
    修复:用pthread_mutex_t互斥锁保护共享变量。比如线程每次循环前先加锁检查found,如果已经找到密码就直接退出;找到密码时也要加锁修改found并输出,避免多个线程同时写控制台。

  • 线程资源未回收
    创建线程后没调用pthread_join等待线程结束,或者线程退出时没清理堆内存,长期运行会导致内存泄漏或资源冲突,也可能触发段错。
    修复:把创建的线程ID存在数组里,最后循环调用pthread_join等待所有线程结束;线程里用malloc分配的参数,记得在退出前free。

简化的可运行示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#define TARGET_PASS "test123"
#define PASS_LENGTH 6
#define THREAD_COUNT 4

// 全局共享变量+互斥锁
pthread_mutex_t crack_mutex;
int password_found = 0;

// 线程参数结构体
typedef struct {
    int thread_idx;
    int start_pos;
    int step;
} ThreadArgs;

void* brute_force(void* arg) {
    ThreadArgs* args = (ThreadArgs*)arg;
    char guess[PASS_LENGTH + 1] = {0}; // 留足终止符位置
    const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    int charset_size = strlen(charset);

    // 分任务遍历字符集(这里以第一位为例,可扩展多位循环)
    for (int i = args->start_pos; i < charset_size; i += args->step) {
        // 先检查是否已找到密码,避免无效运算
        pthread_mutex_lock(&crack_mutex);
        if (password_found) {
            pthread_mutex_unlock(&crack_mutex);
            break;
        }
        pthread_mutex_unlock(&crack_mutex);

        guess[0] = charset[i];
        // 这里可以扩展为多位密码的嵌套循环...

        if (strcmp(guess, TARGET_PASS) == 0) {
            pthread_mutex_lock(&crack_mutex);
            password_found = 1;
            printf("破解成功:%s\n", guess);
            pthread_mutex_unlock(&crack_mutex);
            break;
        }
    }

    free(arg); // 释放堆内存
    return NULL;
}

int main() {
    pthread_t threads[THREAD_COUNT];
    pthread_mutex_init(&crack_mutex, NULL);

    // 创建线程
    for (int i = 0; i < THREAD_COUNT; i++) {
        ThreadArgs* args = (ThreadArgs*)malloc(sizeof(ThreadArgs));
        args->thread_idx = i;
        args->start_pos = i;
        args->step = THREAD_COUNT;
        pthread_create(&threads[i], NULL, brute_force, (void*)args);
    }

    // 等待所有线程结束
    for (int i = 0; i < THREAD_COUNT; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_mutex_destroy(&crack_mutex);
    return 0;
}

内容的提问来源于stack exchange,提问作者yuggoth19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:01:09