#!/usr/bin/env python3 """ 简化的Flask应用,用于快速启动工作空间界面 """ import os from flask import Flask, render_template, request, jsonify app = Flask(__name__, template_folder='/home/hzk/桌面/Codedetection/src/ui/templates', static_folder='/home/hzk/桌面/Codedetection/src/ui/static') app.secret_key = 'workspace-demo-key' @app.route('/') def index(): """主页""" return render_template('index.html') @app.route('/upload') def upload_page(): """上传页面""" return render_template('upload.html') @app.route('/results') def results_page(): """结果页面""" # 提供默认的uploaded_file数据以避免模板错误 default_file = { 'filename': '示例代码文件.c', 'size': 2048, 'path': '/tmp/example.c', 'file_id': 'demo_file', 'is_pasted': False } # 模拟验证结果数据 mock_results = { 'summary': { 'functions_parsed': 3, 'verification_status': '部分通过', 'verification_detail': '2/3 断言验证成功', 'mutation_score': '85%', 'processing_time': '12.5s' }, 'functions': [ { 'name': 'memcpy', 'signature': 'void* memcpy(void* dest, const void* src, size_t n)', 'params': ['dest', 'src', 'n'], 'return_type': 'void*', 'complexity': '中等', 'issues': ['可能存在缓冲区溢出风险', '需要验证指针有效性'] }, { 'name': 'strlen', 'signature': 'size_t strlen(const char* str)', 'params': ['str'], 'return_type': 'size_t', 'complexity': '低', 'issues': ['需要验证输入指针非空'] }, { 'name': 'custom_function', 'signature': 'int custom_function(int input, char* buffer)', 'params': ['input', 'buffer'], 'return_type': 'int', 'complexity': '高', 'issues': ['数组越界风险', '输入参数未验证', '内存泄漏可能'] } ], 'specification': { 'preconditions': [ '__requires(dest != NULL)', '__requires(src != NULL)', '__requires(n <= MAX_BUFFER_SIZE)', '__requires(valid_read(src, n))', '__requires(valid_write(dest, n))' ], 'postconditions': [ '__ensures(__result == dest)', '__ensures(__mem_eq(dest, src, n))', '__ensures(__pointer_ok(dest))', '__ensures(__pointer_ok(src))' ], 'assertions': [ { 'line': 45, 'condition': 'dest != NULL', 'status': 'PASS', 'message': '目标指针非空检查通过' }, { 'line': 46, 'condition': 'src != NULL', 'status': 'PASS', 'message': '源指针非空检查通过' }, { 'line': 47, 'condition': 'n <= MAX_BUFFER_SIZE', 'status': 'FAIL', 'message': '缓冲区大小检查失败' } ] }, 'mutation_results': { 'total_tests': 15, 'passed': 12, 'failed': 3, 'score': 80, 'mutations': [ { 'type': '边界值测试', 'description': '测试n=0和n=MAX_SIZE边界情况', 'status': 'PASS', 'killed': 2 }, { 'type': '空指针测试', 'description': '测试NULL指针输入', 'status': 'FAIL', 'killed': 0 }, { 'type': '内存重叠测试', 'description': '测试src和dest重叠情况', 'status': 'PARTIAL', 'killed': 1 } ] }, 'quality_metrics': { 'completeness': 85, 'correctness': 78, 'readability': 92, 'maintainability': 80, 'security': 75, 'overall_score': 82 } } return render_template('results.html', uploaded_file=default_file, results=mock_results) @app.route('/workspace') def workspace_page(): """工作空间页面""" # Calculate WebSocket and API URLs ws_scheme = 'wss' if request.scheme == 'https' else 'ws' ws_url = f"{ws_scheme}://{request.host}/ws/workspace" api_base_url = f"{request.scheme}://{request.host}/api" return render_template('workspace.html', ws_url=ws_url, api_base_url=api_base_url) @app.route('/api/status') def api_status(): """API状态端点""" return jsonify({ 'status': 'running', 'version': '0.1.0', 'services': { 'web': 'online', 'parser': 'ready', 'llm': 'configured', 'cbmc': 'ready' } }) if __name__ == '__main__': print("🚀 CodeDetect 工作空间服务器启动中...") print("📍 访问地址:") print(" - 主页: http://localhost:8080") print(" - 工作空间: http://localhost:8080/workspace") print(" - 上传页面: http://localhost:8080/upload") print("🔧 按Ctrl+C停止服务器") app.run( host='0.0.0.0', port=8080, debug=True, threaded=True )