加载中…
个人资料
怪盗基德
怪盗基德
  • 博客等级:
  • 博客积分:0
  • 博客访问:109,630
  • 关注人气:9
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
博文
标签:

virtual

cffexplorer

msvc

分类: 计算机与 Internet

    虚函数表是一个C++领域比较基础内容,同时也是面试中经常涉及到的一个内容,今天这个Session就通过一个实际例子,带你一步一步揭开虚表的面纱(注:本文讨论的仅针对 MSVC微软实现的方式,其他平台可能会有所不同,有机会再给大家分享其他平台的实现)。

    !废话不多,直接上代码。我们的测试工程包括一个简单的CMakeLists.txt文件,定义了两个工程,一个Base,只有一个基类,另一个Main,里面有子类和main方法。

cmake_minimum_required(VERSION 3.26)

project(main)

add_library(BASE SHARED base.cpp)

target_compile_definitions(BASE PRIVATE MYLIBRARY_EXPORTS)

add_executable(main main.cpp derived.cpp)

标签:

__macosx

xattr

分类: 计算机与 Internet

这次Notary失败,发现是某处多了__MACOSX的目录,里面是带树结构的隐藏文件以._开头。

这些隐藏文件通常Finder看不到,只有命令行能看到。而__MACOSX文件夹是可见的。

conanchen@ConanChen ~ % ls -al /Users/conanchen/Downloads/mac_uvsl_no_maxosx/__MACOSX

total 16

drwx------ 4 conanchen staff 128 Jan 23 00:05 .

drwxr-xr-x@ 9 conanchen staff 288 Jan 25 16:19 ..

-rw-r--r-- 1 conanchen staff 224 Nov 22 06:43 ._ReleaseNotes.txt

-rw-r--r-- 1 conanchen staff 224 Nov 22 06:43 ._ngspice-41-manual.pdf

这个目录里面大部分是AppleDobule文件(._开头),记录着一些扩展苹果属性。有些文件签名以后,数据存在这些meta数据中。

当用7z压缩时,它会把扩展属性转换成__MACOSX文件夹中带树结构的对应._文件并压入压缩包,

解压时,用7z能完全恢复,而用ditto时,则会跳过._开头文件,也就是ditto会丢失__MACOSX中的._文件。

__MACOSX文件夹会保留,最后结果就是__MACOSX文件夹还会在这。

当拷贝整个文件夹时,__MAC

(2024-01-18 13:53)
标签:

notary

syspolicy_check

notary-submission

分类: 计算机与 Internet

最近提交的Notary失败,报错只显示

'message': 'The signature of the binary is invalid.',

最后发了TSI去苹果,最后得到的回复中显示,是带扩展属性的文件丢失,带这种属性的文件经过压缩和解压,就不见了。

然后签名的时候有它,最后提交的东西里解压出来没它,就报错了。

Autodesk Fusion/Autodesk Fusion 360.app: a sealed resource is missing or invalid

file missing: …/Autodesk Fusion/Autodesk Fusion 360.app/Contents/Libraries/Applications/Electron/LibEagle/ngspice/__MACOSX/share/ngspice/scripts/intel/._spinit

这时候错应该报a sealed resource is missing or invalid 而不是invalid signature

偷师苹果回复的邮件发现一个神命令syspolicy_check, 它其中的一个参数notary-submission就能用来检查Notary

syspolicy_check --notary-submission -vvv 文件名

可以得到更详细的输出。

conanchen@ConanChen ~ % syspolicy_check notary-submission sample.app

App has failed one or more pre-notarization checks.

-----------------

标签:

clang

awk

debug

sed

分类: 计算机与 Internet

clang /Users/conanchen/hello.c用这样的方法来编译源文件的时候,clang内部会重新调用一次clang子程序,并且给出一串参数。

在Mac上调试一个未启动程序可以用wait的方法等待。

但问题是当前调试的正是clang,这个方法会因为当前有同样的程序在运行而失效。Windiows上有对应的插件和方法来解决,Mac当然也可以做类似的,

一直等待,查找和当前进程不相同的clang时,去attach,但是不那么直接。

为了解决这个问题,直接在clang启动新进程的地方打断点,把参数Trace出来,然后单独列成参数来启动新的clang。

具体代码在/Users/conanchen/llvm-project/clang/lib/Driver/Job.cpp

intCommand::Execute(ArrayRef<</span>std::optional<</span>StringRef>> Redirects,

                     std::s

标签:

read

grep

shell

pipe

分类: 计算机与 Internet

我们知道在Shell中,管道相当好用。但是如何让自己写的函数能支持管道,从之前的方法中得到输入,并执行是个问题。

经过实验,需要用read从管道中读取,然后使用。示例代码如下。

这里是最外层的调用

echo '##### Move Resources under Frameworks #####'

pushd ./Contents

if [ -d ./Frameworks/A360 ]

then

searchAndMoveResources ./Frameworks/A360

fi

popd

具体函数实现如下

searchAndMoveResources()

{

find $1 ! -name '*.dylib' -and ! -name '*.so' -and ! -name '.DS_Store' -and ! -name '*.a' -type f -print0 | xargs -P $NCPU -0 -L1 file | grep -v -E 'Mach-O .*' | cut -d ':' -f1 | movetoResources

}

movetoResources才是关键,它从管道中读取输入,然后执行。实现如下

movetoResources()

{

read source_file

while [[ ! -z $source_file ]]

do

标签:

shell

find

xargs

readelf

for

分类: 计算机与 Internet

项目需要Scan一下哪个库对Boost有符号依赖,在Linux上,所以想用python或shell来完成。

为了做到这个效果,决定还是用shell,因为一些查找需要find和readelf等命令。

#!/bin/bash

# Directory to search in

directory='/home/client-delivery/.neutron_3p'

# Find all folders in the specified directory

folder_paths=$(find $directory -name 'RuntimeRoots')

# Iterate over each folder path

for folder_path in $folder_paths; do

updated_folder_path='$folder_path/Release'

files_pathes=$(find $updated_folder_path -print0 -name '*.so' | xargs -0 -L1 file | grep 'ELF ' | cut -d ':' -f1)

for file_path in $files_pathes; do

#echo 'Checking $file_path'

sizes=$(readelf -s $file_path | grep boost |

标签:

codesign

unknown_0x32

invalid

-size

分类: 计算机与 Internet

在运行Mac程序时,在Xcode中运行,签名不被检查,直接双击会报错。

open ~/Library/Logs/DiagnosticReports/ 可以找到过去的错误日志。

大概率得到下面这串,在当时直接弹出的Report中有一样的内容。

发现其中最有用的是 ---> mapped file 102d14000-102e18000 [ 1040K] r--/rwx SM=COW ...t_id=5e1b0559

这行中的1040K

在目录中用

find . -size +1040k -size -1050k

或者

find . -size +1M -size -2M

来找对应大小的二进制文件

在列表中通常就能找出原因了。

chencon@ADSKDQJQR0H4DT Release % find . -size +85M -size -86M

./Frameworks/MeshMixer/libmmsdk.dylib

-------------------------------------

Translated Report (Full Report Below)

-------------------------------------

Process: Autodesk Fusion 360 [74251]

Path: /Users/USER/*/Autodesk Fusion 360.app/Contents/M

标签:

permissive

constexpr

static_assert

分类: 计算机与 Internet

项目中遇到一个情况,当使用find_package去引用Qt以后,编译失败了。

原因是Qt那会自动引入/permissive选项。编译时,有没有这个选项,会造成结果不同。

代码如下:

template static constexpr AVKTypeTag of()

{

if constexpr (std::is_same_v)

{

return {ID::nil};

}

else if constexpr (std::is_same_v)

{

return {ID::f32};

}

.....

else

{

#ifdef __APPLE__

#else

static_assert(false, 'invalid type');

#endif

}

}

constexpr本意是用来在编译时决定表达式的值,然后编译的时候就知道是用的哪个分支,在优化时,可以直接生成对应的代码。

但是并不是编译时,选择性编译,也就是说if里的表达式是真,并不代表不再编译else分支。

而上面代码明显是写成了这个意图,搞混了编译时和运行时。static_assert(false)

这种代码永远是错的。

那为撒去掉了苹果,在Windows上有时候能

标签:

--mime-encoding

iconv

od

hexdump

分类: 计算机与 Internet

这次做性能测试,结果文件是xml,但是antlr读取好像遇到问题,于是查看编码

conanchen@ConanChen ~ % file --mime-encoding /Users/conanchen/Desktop/PerformanceReport/2.1.284_macOS\ 13.0_20230317183825_PerformanceResult.xml

/Users/conanchen/Desktop/PerformanceReport/2.1.284_macOS 13.0_20230317183825_PerformanceResult.xml: utf-16le

conanchen@ConanChen ~ % iconv -f utf-16le -t utf-8 /Users/conanchen/Desktop/PerformanceReport/2.1.284_macOS\ 13.0_20230317183825_PerformanceResult.xml >> utf-8.xml

conanchen@ConanChen ~ % file --mime-encoding utf-8.xml

utf-8.xml: utf-8

用iconv就能把文件转换格式。

用od或hexdump可以显示出文件头内容

conanchen@ConanChen ~ % od -Ax -t x1 -N 16 /Users/conanchen/utf-8.xml

0000000 ef bb bf 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e

0000010

conanchen@ConanChen ~ % od -Ax -t x1 -N 16 /Users/conanchen/Desktop/PerformanceReport/2.1.284_macOS\ 13.0_2

标签:

date

y

((datey-1))

分类: 计算机与 Internet

由于我们的repo上分支太多,需要到对应的JenkinsJob查看任务。每次手动太累了。于是想自动化,但是发布分支有多个,于是想自动根据年份筛选。

conanchen@ConanChen client-delivery % date +%y

23

date +%y可以显示出当前的年份

问题在于我们的分支是

remotes/origin/release/2208.0

remotes/origin/release/2208.1

22财年,于是。

conanchen@ConanChen client-delivery % git branch -a | grep -E 'remotes/origin/release/22|remotes/origin/release/23'

remotes/origin/release/2208.0

remotes/origin/release/2208.1

类似实现上面的功能,22和23需要用date +%y来替代。

conanchen@ConanChen client-delivery % echo $((`date +%y`-1))

22

$((`date +%y`-1))能用来替换去年。

结合起来

set getBranchCommand to 'cd $HOME/client-delivery;git branch -a |

grep -E \'remotes/origin/' & branchPrefix & '/`date +%y`| remo

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有