Commit 19953355 authored by Clemens Hammacher's avatar Clemens Hammacher Committed by Commit Bot

Fix undefined behaviour on CommentOperator

The {CommentOperator}, used for implementing the --code-comments flag,
is not UBSan-safe. This CL fixes this and adds a test which uses code
comments.

R=bmeurer@chromium.org

Bug: v8:7744
Change-Id: Ia6ec509e77d998df085ac7377cb24854354e3aa2
Reviewed-on: https://chromium-review.googlesource.com/1051235
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Reviewed-by: 's avatarTobias Tebbi <tebbi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53100}
parent d9514955
...@@ -880,11 +880,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -880,11 +880,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArchDebugBreak: case kArchDebugBreak:
__ stop("kArchDebugBreak"); __ stop("kArchDebugBreak");
break; break;
case kArchComment: { case kArchComment:
Address comment_string = i.InputExternalReference(0).address(); __ RecordComment(reinterpret_cast<const char*>(i.InputInt32(0)));
__ RecordComment(reinterpret_cast<const char*>(comment_string));
break; break;
}
case kArchThrowTerminator: case kArchThrowTerminator:
DCHECK_EQ(LeaveCC, i.OutputSBit()); DCHECK_EQ(LeaveCC, i.OutputSBit());
unwinding_info_writer_.MarkBlockWillExit(); unwinding_info_writer_.MarkBlockWillExit();
......
...@@ -795,11 +795,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -795,11 +795,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArchDebugBreak: case kArchDebugBreak:
__ Debug("kArchDebugBreak", 0, BREAK); __ Debug("kArchDebugBreak", 0, BREAK);
break; break;
case kArchComment: { case kArchComment:
Address comment_string = i.InputExternalReference(0).address(); __ RecordComment(reinterpret_cast<const char*>(i.InputInt64(0)));
__ RecordComment(reinterpret_cast<const char*>(comment_string));
break; break;
}
case kArchThrowTerminator: case kArchThrowTerminator:
unwinding_info_writer_.MarkBlockWillExit(); unwinding_info_writer_.MarkBlockWillExit();
break; break;
......
...@@ -771,11 +771,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -771,11 +771,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArchTableSwitch: case kArchTableSwitch:
AssembleArchTableSwitch(instr); AssembleArchTableSwitch(instr);
break; break;
case kArchComment: { case kArchComment:
Address comment_string = i.InputExternalReference(0).address(); __ RecordComment(reinterpret_cast<const char*>(i.InputInt32(0)));
__ RecordComment(reinterpret_cast<const char*>(comment_string));
break; break;
}
case kArchDebugAbort: case kArchDebugAbort:
DCHECK(i.InputRegister(0) == edx); DCHECK(i.InputRegister(0) == edx);
if (!frame_access_state()->has_frame()) { if (!frame_access_state()->has_frame()) {
......
...@@ -299,8 +299,15 @@ class OperandGenerator { ...@@ -299,8 +299,15 @@ class OperandGenerator {
case IrOpcode::kNumberConstant: case IrOpcode::kNumberConstant:
return Constant(OpParameter<double>(node->op())); return Constant(OpParameter<double>(node->op()));
case IrOpcode::kExternalConstant: case IrOpcode::kExternalConstant:
case IrOpcode::kComment:
return Constant(OpParameter<ExternalReference>(node->op())); return Constant(OpParameter<ExternalReference>(node->op()));
case IrOpcode::kComment: {
// We cannot use {intptr_t} here, since the Constant constructor would
// be ambiguous on some architectures.
using ptrsize_int_t =
std::conditional<kPointerSize == 8, int64_t, int32_t>::type;
return Constant(reinterpret_cast<ptrsize_int_t>(
OpParameter<const char*>(node->op())));
}
case IrOpcode::kHeapConstant: case IrOpcode::kHeapConstant:
return Constant(HeapConstantOf(node->op())); return Constant(HeapConstantOf(node->op()));
case IrOpcode::kDeadValue: { case IrOpcode::kDeadValue: {
......
...@@ -768,11 +768,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -768,11 +768,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArchDebugBreak: case kArchDebugBreak:
__ stop("kArchDebugBreak"); __ stop("kArchDebugBreak");
break; break;
case kArchComment: { case kArchComment:
Address comment_string = i.InputExternalReference(0).address(); __ RecordComment(reinterpret_cast<const char*>(i.InputInt32(0)));
__ RecordComment(reinterpret_cast<const char*>(comment_string));
break; break;
}
case kArchNop: case kArchNop:
case kArchThrowTerminator: case kArchThrowTerminator:
// don't emit code for nops. // don't emit code for nops.
......
...@@ -788,11 +788,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -788,11 +788,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArchDebugBreak: case kArchDebugBreak:
__ stop("kArchDebugBreak"); __ stop("kArchDebugBreak");
break; break;
case kArchComment: { case kArchComment:
Address comment_string = i.InputExternalReference(0).address(); __ RecordComment(reinterpret_cast<const char*>(i.InputInt64(0)));
__ RecordComment(reinterpret_cast<const char*>(comment_string));
break; break;
}
case kArchNop: case kArchNop:
case kArchThrowTerminator: case kArchThrowTerminator:
// don't emit code for nops. // don't emit code for nops.
......
...@@ -879,11 +879,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -879,11 +879,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
case kArchTableSwitch: case kArchTableSwitch:
AssembleArchTableSwitch(instr); AssembleArchTableSwitch(instr);
break; break;
case kArchComment: { case kArchComment:
Address comment_string = i.InputExternalReference(0).address(); __ RecordComment(reinterpret_cast<const char*>(i.InputInt64(0)));
__ RecordComment(reinterpret_cast<const char*>(comment_string));
break; break;
}
case kArchDebugAbort: case kArchDebugAbort:
DCHECK(i.InputRegister(0) == rdx); DCHECK(i.InputRegister(0) == rdx);
if (!frame_access_state()->has_frame()) { if (!frame_access_state()->has_frame()) {
......
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --code-comments --print-code
(function simple_test() {
function fib(n) {
return n < 2 ? n : fib(n - 1) + fib(n - 2);
}
// Call a number of times to trigger optimization.
for (let i = 0; i < 100; ++i) {
fib(8);
}
})();
(function test_asm() {
function asm() {
'use asm';
function f() {}
return f;
}
var m = asm();
})();
...@@ -418,6 +418,10 @@ ...@@ -418,6 +418,10 @@
# https://bugs.chromium.org/p/v8/issues/detail?id=7102 # https://bugs.chromium.org/p/v8/issues/detail?id=7102
# Flaky due to huge string allocation. # Flaky due to huge string allocation.
'regress/regress-748069': [SKIP], 'regress/regress-748069': [SKIP],
# https://crbug.com/v8/7738
# Code comments currently leak memory.
'code-comments': [SKIP],
}], # 'asan == True' }], # 'asan == True'
############################################################################## ##############################################################################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment