Vigenere密码解码无法正常工作

时间:2018-11-08 21:29:55

标签: c c-strings vigenere

我正在写一个vigenere密码,用作可加载内核模块的一部分。因此,我不能使用字符串库。这就是为什么我包括了单独的循环以获取键和输入长度的原因。 include语句和main语句仅用于测试。

每当我使用不是全部大写的键时,由于地址清理程序错误,该程序将崩溃。仅当我包含应该将键输入转换为大写的代码时,才会发生这种情况。我不确定这在哪里不正确,因为我转换为大写字母的方法与我过去在堆栈溢出中看到的方法相同。没有这些行,它将运行正常并且不会崩溃。

此外,解码阶段无法按预期方式工作,它给出了错误的解码消息。我可以想象的唯一可能的问题是我允许输入包含空格,但是我不认为这是问题,因为我只是在字符串中添加了空格。对于此代码在哪里出错,我将非常感激。 尝试转换为大写字母时的完整错误是:

InjectedIntlProps

这是我的代码:

==25694==ERROR: AddressSanitizer: BUS on unknown address 0x00010c98ae80 (pc 0x00010c989ac2 bp 0x7ffee3277610 sp 0x7ffee3277440 T0)
    #0 0x10c989ac1 in encrypt (vig:x86_64+0x100001ac1)
    #1 0x10c98aca1 in main (vig:x86_64+0x100002ca1)
    #2 0x7fff5c419ef8 in start (libdyld.dylib:x86_64+0x16ef8)

==25694==Register values:
rax = 0x000000010c98ae80  rbx = 0x00007ffee3277440  rcx = 0x000000010c98ae4b  rdx = 0x0000000000000004  
rdi = 0x000000010c98ae80  rsi = 0x000000010c98ae4b  rbp = 0x00007ffee3277610  rsp = 0x00007ffee3277440  
 r8 = 0x00001000219315d0   r9 = 0x0000000000000004  r10 = 0x0000000000000000  r11 = 0x0000000000000000  
r12 = 0x0000000000000000  r13 = 0x0000000000000000  r14 = 0x0000000000000000  r15 = 0x0000000000000000  
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: BUS (vig:x86_64+0x100001ac1) in encrypt
==25694==ABORTING
Abort trap: 6

1 个答案:

答案 0 :(得分:0)

您正在尝试修改字符串文字。

您以以下方式致电encrypted

encrypt("The quick brown fox jumps over lazy dogs","key");

然后在encrypt中,修改第二个参数:

key[i] = key[i] - 'a' + 'A';

字符串文字是只读的,尝试修改它们会调用undefined behavior

制作key的本地副本,并在执行大小写转换时对其进行修改。