|
|
#!/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
|
|
|
) |