1. Trang chủ
  2. » Luận Văn - Báo Cáo

Phân tíh và huyển đổi mã nguồn cc++ từ hệ điều hành windows 32 bit sang hệ điều hành windows 64bit

69 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Phân Tích Và Chuyển Đổi Mã Nguồn C/C++ Từ Hệ Điều Hành Windows 32 Bit Sang Hệ Điều Hành Windows 64 Bit
Tác giả Đoàn Quang Trung
Người hướng dẫn TS. Ban Hà Bằng
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Công Nghệ Thông Tin
Thể loại Luận Văn Thạc Sĩ
Năm xuất bản 2018
Thành phố Hà Nội
Định dạng
Số trang 69
Dung lượng 1,78 MB

Nội dung

58 Trang 7 THUẬT NGỮ TIẾNG ANH32- bit Hệ điều hành 32 bit 64 - bit Hệ điều hành 64 bit Register Thanh ghi ALU Arithmetic logic unit - bộ xử lý tính toán Function driven Lập trình hướng

Trang 1

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI -

ĐOÀN QUANG TRUNG

Phân tích và chuyển đổi mã nguồn C/C++ từ hệ điều hành Windows

32 bit sang hệ điều hành Windows 64 bit

TS BAN HÀ BẰNG

HN - 2018

Trang 2

L ỜI C AM Đ AN O

Tôi xin cam an lu v n là công trình n i c u cđo ận ă gh ên ứ ủa riêng nhcá ân tôi, ông sao chkh ép c a ai do tôi t ủ ự nghiên c u, ứ đọc, ịchd tài li u, ng h p vệ tổ ợ à

th hiực ện Nội dung lý thuyết tr g trong n v n i s d ng mon luậ ă tô có ử ụ ộ ốt s tài li u ệ

tham khảo như đã trình b trong ày phần tài li u tham kh o ệ ả Các li u h số ệ , c ương trình ph m m và ần ề những k qu tr g lu n v n là trung ết ả on ậ ă thực và ch a ư được công bố trong bất k một ỳ công trình n khào ác

HN ngày 20, tháng n m 09 ă 2018

H c ê ọ vi n thực hiện Đoàn Quang Trung

Trang 3

L ỜI ẢM ƠN C

Trước khi trình bày nội dung chính của luận văn, em xin bày tỏ lòng biết

ơn sâu sắc tới TS Ban Hà Bằng người đã tận tình chỉ bảo, hướng dẫn và giúp đỡ

em trong suốt quá trình hoàn thành luận văn này

Em xin chân thành cảm ơn tập thể cán bộ Khoa Công Nghệ Thông Tin, Viện Đào Tạo Sau Đại học, Trường Đại học Bách khoa Hà Nội, đã tạo mọi điều kiện thuận lợi cho em trong quá trình học tập và nghiên cứu

Nhân dịp này em cũng xin được gửi lời cảm ơn chân thành tới gia đình, bạn bè đã luôn bên em cổ vũ, động viên, giúp đỡ em trong suốt quá trình học tập

và thực hiện luận văn

Xin chân thành cảm ơn!

Hà Nội, ngày 20 tháng 09 năm 2018

Học viên

Đoàn Quang Trung

Trang 4

MỤC LỤC

L ỜI CAM O Đ AN

L ỜI ẢM ƠN C

CÁC HÌNH VẼ, BẢNG BIỂU TRONG LUẬN VĂN

THUẬT NGỮ TIẾNG ANH

MỞ ĐẦU 1

Chương 1 Tổng quan về hệ điều hành 32bit và 64bit : 2

1.1.Các khái niệm cơ bản về x86, x86- 64, IA -64, 32bit và 64 bit 2

1.2.Hoạt động của CPU 2

1.3.Vai trò của 32 bit hay 64bit trong kiến trúc của CPU - 3

1.4.Lợi ích và hạn chế của vi xử lý 64 bit so với 32 - -bit 4

1.4.1.Lợi ích 4

1.4.2.Nhược điểm 5

Chương 2 : Ng ôn ngữ lập trình C/C++ và những vấn đề phát sinh khi dịch chuyển ứng dụng nền tảng 32bit lên 64 bit 6

2.1.Ngôn ngữ lập trình C và C++ 6

2.1.1.Ngôn ngữ lập trình C 6

2.1.2.Ngôn ngữ lập trình C++ 7

2.1.3.Sự khác nhau cơ bản giữa C và C++ 8

2.2.Đa luồng (Multithread) trong C++ 9

2.2.1.Khái niệm đa luồng 9

2.2 2.Đa luồng trong C++ 9

2.3.Các phương pháp hiện có phát hiện bẫy lỗi khi chuyển mã code C và C ++ sang Windows 64 bit 10

2.3.1.Review code 11

2.3.2.Phân tích code tĩnh 11

2.3.3.Phân tích code động 12

2.3.4.Phương pháp hộp trắng 12

2.3.5.Phương pháp hộp đen 13

2.3.6.Phương pháp kiểm thử thủ công 13

2.4.Nguyên nhân và phương pháp chi tiết 14

2.4.1.Tắt cảnh báo (Disabled warnings) 14

2.4.2.Sử dụng những hàm với số lượng của những đối số thay đổi 14

2.4.3.Số ma thuật 15

Trang 5

2.4.4.Lưu trữ số nguyên trong kiểu double 17

2.4.5.Phép toán dịch bit 18

2.4.6 Lưu trữ các giá trị của con trỏ 19

2.4.7.Memsize kiểu trong union 21

2.4.8.Thay đổi một kiểu mảng 23

2.4.9.Hàm ảo với các đối số kiểu memsize 24

2.4.10.Quá trình serialization (tuần tự) và trao đổi dữ liệu 26

2.4.11.Trường bit 28

2.4.12.Gợi ý phép tính địa chỉ 31

2.4.13.Chuỗi chỉ số 34

2.4.14 Sự pha trộn của việc sử dụng các kiểu số nguyên đơn giản và kiểu memsize 36

2.4.15 Sự chuyển đổi Kiểu ẩn trong khi dùng hàm 39

2.4.16 Vấn đề nạp chồng hàm 40

2.4.17 Căn chỉnh dữ liệu 42

2.4.18 Các ngoại lệ 45

2.4.19 Sử dụng hàm đã lỗi thời & hằng số định nghĩa trước 46

2.4.20 Ép kiểu tường minh 46

Chương 3 Thực nghiệm : 47

3.1.Xây dựng công cụ 47

3.1.1.Đề xuất giải pháp chuyển đổi mã nguồn c/c++ từ hệ điều hành 32 bit sang 64 bit 47

3.1.2.Giao diện chương trình 49

3.2.Ví dụ thực nghiệm khắc phục cảnh báo C4996 51

3.2.1.Nguyên nhân dẫn đến cảnh báo C4996 51

3.2.2.Các thể hiện cụ thể 52

3 2.3.Các cách giải quyết vấn đề 52

3.3.Kết quả thực nghiệm 53

KẾT LUẬN 60

Tài liệu tham khảo 62

Trang 6

CÁC HÌNH VẼ, BẢNG BIỂU TRONG LUẬN VĂN

Hình 2.1 Lưu trữ số nguyên trong kiểu double 18

Hình 2.2 Tính toán giá trị Mask 19

Hình 2.3 Thay đổi một kiểu mảng 24

Hình 2.4 Thứ tự sắp xếp byte trong hệ điều hành 64-bit trên kết thúc lớn và kết thúc nhỏ 29

Hình 2.5 Tính toán biểu thức trên hệ điều hành khác 31

Hình 2.6 Sự thay đổi diễn ra trong biểu thức 40

Hình 3.1 Lưu đồ thuật toán 49

Hình 3.2 Màn hình chính 50

Hình 3.3 Màn hình sau khi hoàn thành 52

Hình 3.4 Danh sách các cảnh báo được xử lý 58

Bảng 1.1 Dung lượng RAM tối đa 1 số hệ điều hành cơ bản hỗ trợ 4

Bảng 2.1 So sánh sự khác nhau giữa C và C++ 8

Bảng 2.2 B2 chứa số ma thuật cơ bản có thể ảnh hưởng đến tính khả thi của một ứng dụng trên một nền tảng mới 16

Bảng 2.3 B4: Biểu thức dịch bit và kết quả trên hệ thống 64bit 19

Bảng 3.1 Kết quả thực nghiệm 59

Trang 7

THUẬT NGỮ TIẾNG ANH

toán

Trang 8

MỞ ĐẦU

Ngày nay, hầu hết các ứng dụng đều đã chạy thông trên nền tảng hệ điều hành Windows 32 bit như Windows NT, Windows 2000, Windows XP cũng với các phần mềm viết trên mã nguồn dựa trên bộ Visual Studio của chính hãng Microsoft Tuy nhiên, khi chuyển đổi sang hệ điều hành Windows

64 bit như Windows 10 thì gặp vấn đề về tương thích mã nguồn Lý do là mã nguồn viết cho các ứng dụng trên nền tảng hệ điều hành Windows 32 bit có đơn vị xử lý là 32 bit trong khi đối với trình dịch bộ Visual Studio trong hệ điều hành Windows 64 bit thì đơn vị xứ lý lại là 64 bit Các lỗi cảnh báo (Warning) là lỗi của bộ phân tích ngữ nghĩa (semantic analyzer) giải thích cách xử lý khác nhau của trình dịch đối với các đối tượng (biến, hằng, hàm, tên gọi…) của mã nguồn viết trên hệ điều hành 64 bit so với 32 bit Mục tiêu của đề tài là sử dụng các công cụ trình dịch hiện có để tự động phân tích và sinh mã nguồn C/C++ mới cho hệ điều hành Windows 64 bit từ các mã nguồn C/C++ hiện có vốn viết cho hệ điều hành Windows 32 bit, sao cho giảm thiểu

số lỗi cảnh báo

Nhận thấy tầm quan trọng của việc sinh mã tự động để giảm hiểu công sức và thời gian của lập trình viên, em đã tìm hiểu và cùng với sự hướng dẫn tận tình, giúp đỡ của TS Ban Hà Bằng em đã chọn đề tài "Phân tích và

chuyển đổi mã nguồn C/C++ từ hệ điều hành Windows 32 bit sang hệ điều

hành Windows 64 bit"

Bố cục luận văn gồm 3 chương sau:

• Chương 1: Tổng quan về hệ điều hành 32bit và 64bit

• Chương 2: Những vấn đề phát sinh khi dịch chuyển ứng dụng nền

tảng 32-bit lên 64-bit

• Chương 3: Cơ sở lý thuyết và ứng dụng

Trang 9

CHƯƠNG 1 TỔNG QUAN VỀ HỆ ĐIỀU HÀNH 32BIT VÀ 64BIT

Mục đích của chương này là giới thiệu sự khác biệt giữa hệ điều hành 32bit về 64bit cũng như ưu nhược điểm của chúng

1.1 Các khái niệm cơ bản về x86, x86-64, IA-64, 32bit và 64 bit

- x86: Đây là tên của một bộ tập lệnh chỉ dẫn do Intel và AMD phát triển Nó được xây dựng dựa trên vi xử lí Intel 8086, một con chip ra mắt năm 1978 Lý do

có chữ "x86" đó là vì những model kế nhiệm cho 8086 cũng được đặt tên có đuôi

là "86" Trước đây x86 hỗ trợ điện toán 16-bit, giờ đây là 32-bit

- x86-64: còn có tên khác là x64, x86_64 hoặc amd64 Đây là cái tên

dùng để chỉ phiên bản 64 bit của tập chỉ dẫn x86 Cấu hình x86- -64 ban đầu được tạo ra bởi AMD Lúc mới ra mắt, AMD gọi x86-64 là AMD64, Intel thì gọi bằng cái tên IA 32e và EMT64 Cách gọi tập chỉ dẫn này cũng khác nhau -với các hãng phần mềm, Apple thì gọi là x86_64, Sun Microsystem (giờ đã thuộc về Oracle) và Microsoft thì gọi là x64, nhiều bản distro Linux lại dùng chữ AMD64 AMD K8 là vi xử lí đầu tiên trên thế giới sử dụng x86-64

- IA-64: kiến trúc này sử dụng trong dòng vi xử Intel Itanium, chủ yếu

xuất hiện trong những máy chủ doanh nghiệp hoặc hệ thống tính toán hiệu năng cao chứ ít dùng trong máy tính cá nhân IA-64 hoàn toàn khác biệt và cũng không tương thích với các lệnh của tập lệnh x86 hay x86- 64

- 32- bit và 64 bit: Hai con số này dùng để chỉ độ dài thanh ghi (register)

-của CPU và là một loại hình điện toán chứ không phải là một tập kiến trúc lệnh như ba thứ trên Người ta có thể dùng khái niệm 32-bit và 64-bit để chỉ CPU hoặc phần mềm

CPU gồm nhiều bộ phận, nhưng ở nghiên cứu này chúng ta sẽ miêu tả hoạt động của nó qua 2 thành phần chính: ALU (Arithmetic logic unit bộ xử-

Trang 10

lý tính toán) và registers (thanh ghi) Register, ALU, và một số linh kiện khác hợp thành một nhân CPU

- ALU có thể thực hiện những phép toán thông thường như cộng trừ, nhân, chia; ngoài ra còn có thể chạy những phép logic như so sánh 'hoặc', 'và'

- Register là một loại bộ nhớ được tích hợp thẳng vào CPU và nó có tốc

độ hoạt động bằng hoặc gần sát với CPU Dung lượng của register thường rất nhỏ Những CPU 32 bit sẽ có bộ ALU và register với độ rộng là 32- -bit, còn CPU 64-bit thì sẽ có độ rộng của những thành phần này là 64-bit

1.3 Vai trò của 32 bit hay 64bit trong kiến trúc của CPU

Đó là độ dài của register đồng thời là độ dài của địa chỉ mà CPU sử dụng.+ Độ dài thanh ghi càng lớn thì đem lại kết quả tính toán cao hơn Ví dụ:

Để thực hiện phép tính 12+34 trên CPU có thanh ghi độ dài 1, ALU sẽ phải thực hiện 2 phép tính: 1+3 và 2+4, sau đó nối kết quả lại với nhau Nếu CPU

có độ dài là 2 thì nó sẽ có thể thực hiện phép tính 12+34 và cho ra kết quả ngay lập tức, và không phải tính từng bước

+ Độ dài địa chỉ càng lớn thì khả năng lưu trữ cang cao Với kiến trúc 32bit ta sẽ có 232 = 4294967296 số địa chỉ (khoảng 4,29 tỉ địa chỉ) và cũng tương ứng với dung lượng 4GB Trong trường hợp này, nếu có nhiều hơn 4GB RAM thì phần nhiều hơn đó sẽ không có địa chỉ, và CPU không cách gì

"liên lạc" đến chúng được

Do nhu cầu sử dụng bộ nhớ ngày càng lớn nên cần đến kiến trúc 64bit Khi đó số địa chỉ có thể sử dụng 264 = 1.8446744 x 10^19 tương đương dung lượng 16 Exbibyte địa chỉ lớn hơn rất rất rất nhiều so với kiến trúc 32-bit Bên dưới là bảng dung lượng RAM tối đa mà Windows XP, Windows 7, Windows 8 và Win 10 có thể hỗ trợ

Trang 11

Bảng 1.1 Dung lượng RAM tối đa 1 số hệ điều hành cơ bản hỗ trợ

Phiên bản Bản 32- bit Bản 64- bit

- Quản lý bộ ớ ốnh t t hơn: Sử ụ d ng được nhi u Ram, nên có thể tận dụng ề

đượ ốc t i đa RAM trên máy tính

Ví dụ: nếu như máy tính có 6GB Ram thì phiên bản 64bit sẽ s dử ụng được

hết 6GB ram đó Còn ớ v i bản 32bit thì bạn chỉ nhận đượ ốc t i đa là 3.4GB

- Nâng cao năng suất làm việc: Việc tậ ụn d ng đượ ếc h t RAM là m t thế ộmạnh của bản 64bit, chính vì thế mà máy tính chắc chắ ẽ ửn s x lý nhanh hơn

và không có tình tr ng chạ ậm, lag vì thi u RAMế

- Khả năng phân phối RAM cho t ng ng d ng từ ứ ụ ốt hơn: Win x86 chỉcung cấp tối đa cho mỗ ứi ng dụng là 2GB Ram chính vì th mà khi sế ử ụ d ng các ứng dụng nặng như thiết kế đồ ọ h a, làm video, sử ụ d ng thiết k t mô ế

hình 3D… thì sẽ không đáp ng đư c và gây treo máy Nhưng vứ ợ ới phiên bản x64 thì lại khác, nó hỗ trợ lên đến 8TB cho mỗ ứi ng d ng ụ

Trang 12

- Tính bảo mật cao hơn: D a ự vào những tính năng như Kernel Patch Protection hỗ trợ ả b o vệ phần cứng và thực hiện sao lưu dữ ệ li u, loạ ỏi b các trình điều khiể ủ ện c a h thống 16-bit có sẵn

Trang 13

-đó và đưa ra các giải pháp để vượt qua :

- Lỗi lập trình điển hình xảy ra trên các hệ thống 64-bit;

- Nguyên nhân của các lỗi này, với các ví dụ tương ứng;

- Phương pháp sửa lỗi;

- Xem xét các phương pháp và phương tiện tìm kiếm lỗi trong các chương trình 64-bit

- Tránh các lỗi trong khi viết mã cho các hệ thống 64-bit;

- Đẩy nhanh quá trình di chuyển một ứng dụng 32 bit sang kiến - trúc bit thông qua việc giảm thời gian cần thiết để gỡ lỗi và thử nghiệm;

64-2.1 Ngôn ngữ lập trình C và C++

2.1.1 Ngôn ngữ lập trình C

Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX Từ đó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy trong khoa học máy tính mặc dù ngôn ngữ này không được thiết kế dành cho người nhập môn

C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành gần với phần cứng và nó giống với ngôn ngữ Assembler hơn hầu hết các ngôn ngữ bậc cao Hơn thế, C đôi khi được đánh giá như là "có khả năng di động", cho thấy sự

Trang 14

khác nhau quan trọng giữa nó với ngôn ngữ bậc thấp như là Assembler, đó là việc mã C có thể được dịch và thi hành trong hầu hết các máy tính, hơn hẳn các ngôn ngữ hiện tại trong khi đó thì Assembler chỉ có thể chạy trong một số máy tính đặc biệt Vì lý do này C được xem là ngôn ngữ bậc trung.

2.1.2 Ngôn ngữ lập trình C++

C++ (đọc là "C cộng cộng" hay "xi-plus-plus", IPA: /siː pləs pləs/) là một loại ngôn ngữ lập trình Đây là một dạng ngôn ngữ đa mẫu hình tự do có kiểu tĩnh và hỗ trợ lập trình thủ tục, dữ liệu trừu trượng, lập trình hướng đối tượng,

và lập trình đa hình, đồng thời cung cấp các công cụ để can thiệp sâu vào bộ nhớ Từ thập niên 1990, C++ đã trở thành một trong những ngôn ngữ thương mại ưa thích và phổ biến nhất của lập trình viên

C++ được thiết kế với ưu tiên cho lập trình hệ thống và các hệ thống nhúng, tài nguyên hạn chế và lớn, với hiệu suất, hiệu quả và tính linh hoạt cao C ++ có thể tìm thấy ở mọi nơi, với những điểm mạnh là cơ sở hạ tầng phần mềm phong phú và các ứng dụng hạn chế tài nguyên, bao gồm các ứng dụng dành cho máy tính để bàn, máy chủ (ví dụ: thương mại điện tử, tìm kiếm trên web hoặc máy chủ SQL) và các ứng dụng quan trọng về hiệu suất (ví dụ: công tắc điện thoại hoặc thiết bị thăm dò không gian) C ++ là một ngôn ngữ được biên dịch, có thể sử dụng trên nhiều nền tảng

Bjarne Stroustrup của Bell Labs đã phát triển C++ (mà tên nguyên thủy là

"C với các lớp" trong suốt thập niên 1980 như là một bản nâng cao của ngôn ngữ C Những bổ sung nâng cao bắt đầu với sự thêm vào của khái niệm lớp, tiếp theo đó là các khái niệm hàm ảo, chồng toán tử, đa kế thừa, tiêu bản, và

xử lý ngoại lệ Tiêu chuẩn của ngôn ngữ C++ đã được thông qua trong năm

1998 như là ISO/IEC 14882:1998 Phiên bản hiện đang lưu hành là phiên bản C++14, ISO/IEC 14882:2014

Nhiều ngôn ngữ lập trình khác được phát triển dựa trên nền tảng C ++, bao gồm C #, D, Java và các phiên bản mới hơn của C

Trang 15

2.1.3 Sự khác nhau cơ bản giữa C và C++

- Hầu hết IT trên thế giới đều biết về 2 ngôn ngữ lập trình C, C++ Như chúng ta đã biết, C++ là ngôn ngữ ra đời sau ngôn ngữ C, thực chất nó mở rộng cho ngô ngữ C nhằm tăng cường tính an toàn, cung cấp cho các lập trình viên nhiều lựa chọn hơn, đơn giản hóa lập trình ở mức cao hơn, và cung cấp một cách tiếp cận tốt hơn đối với những chương trình có quy mô lớn

- C++ cũng là ngôn ngữ lớn hơn với nhiều tính năng và phức tạp hơn so với C Giữa C và C++ có rất nhiều khác biệt

Hỗ trợ cả biến tham chiếu và con trỏ

Không thể khai báo hàm trong các

structure

Có thể khai báo hàm trong các structure

Được xem là một ngôn ngữ lập

trên xuống (top-down)

Sử dụng phương pháp tiếp cận từ dưới lên (bottom-up)

Là ngôn ngữ lập trình hướng chức

năng (function driven)

Là ngôn ngữ lập trình hướng đối tượng (Object driven)

Trang 16

2.2 Đa luồng (Multithread) trong C++

2.2.1 Khái niệm đa luồng

Đa luồng (Multithreading) là một form chuyên dụng của đa nhiệm (multitasking) và một đa nhiệm là tính năng cho phép máy tính chạy hai hoặc nhiều chương trình đồng thời Nói chung, có hai kiểu đa nhiệm là: process-based và thread-based tương ứng: dựa trên tiến trình và dựa trên luồng

Đa nhiệm dựa trên tiến trình xử lý việc thực thi đồng thời của các chương trình Đa nhiệm dựa trên luồng xử lý việc thực thi đồng thời các phần của cùng một chương trình

Một chương trình đa luồng chứa hai hoặc nhiều phần mà có thể chạy đồng thời Mỗi phần của chương trình đó được gọi là một thread, và mỗi thread định nghĩa một path riêng biệt của sự thực thi

C++ không chứa bất kỳ hỗ trợ có sẵn nào cho các ứng dụng đa luồng Thay vào đó, nó dựa hoàn toàn vào hệ điều hành để cung cấp tính năng này

2.2.2 Đa luồng trong C++

Tạo Thread trong C++

Đây là chương trình chúng ta sử dụng để tạo một POSIX thread:

#include <pthread.h>

pthread_create(thread, attr, start_routine, arg)

Ở đây, pthread_create tạo một thread mới và làm nó có thể thực thi

Chương trình này có thể được gọi bất cứ thời điểm nào ở bất cứ đâu trong code của bạn Dưới đây là miêu tả các tham số:

thread Một định danh duy nhất cho thread mới được trả về bởi

chương trình conattr Một thuộc tính mà có thể được sử dụng để thiết lập các thuộc

tính của thread Bạn có thể xác định một đối tượng thuộc tính thread, hoặc NULL cho các giá trị mặc định

Trang 17

start_routine Chương trình C++ mà thread này sẽ thực thi một khi nó

được tạoarg Một tham số đơn mà có thể được truyền tới start_routine Nó

phải được truyền bởi tham chiếu dạng một con trỏ của kiểu void NULL có thể được sử dụng nếu không có tham số nào được truyền

Số thread tối đa có thể được tạo bởi một tiến trình là phụ thuộc vào trình triển khai (Implementation) Một khi được tạo, các thread là ngang hàng, và

có thể tạo các thread khác Không có sự phụ thuộc giữa các thread trong C++

Kết thúc Thread trong C++

Chương trình sau được sử dụng để kết thúc một POSIX thread trong C++:

#include <pthread.h>

pthread_exit (status)

Ở đây pthread_exit được sử dụng để kết thúc một thread Chương trình

pthread_exit() được gọi sau khi một thread đã hoàn thành công việc của nó và không cần thiết phải tồn tại nữa

Nếu main() kết thúc trước các thread nó đã tạo, và kết thúc chương trình pthread_create(), thì các thread khác sẽ tiếp tục thực thi Nếu không thì, chúng sẽ tự động được kết thúc khi main() hoàn thành

2.3 Các phương pháp hiện có phát hiện bẫy lỗi khi chuyển mã code

C và C ++ sang Windows 64 bit

Có nhiều cách tiếp cận khác nhau để cung cấp tính chính xác của code ứng dụng, một số có thể được tự động hóa và một số khác thì không thể Một

số phương pháp đó là xử lý thủ công, check code tự động, kiểm tra hộp trắng, kiểm tra thủ công, vv Phân tích code tĩnh và kiểm thử hộp đen là các phương pháp có thể được tự động hóa Chúng ta sẽ kãy kiểm tra các phương pháp này một cách chi tiết

Trang 18

2.3.1 Review code

Cách tìm kiếm lỗi lâu đời nhất, được phê duyệt và đáng tin cậy nhất là xem xét mã code Phương pháp này dựa trên việc đọc nhóm mã code với việc quan sát một số quy tắc và khuyến nghị Tuy nhiên, phương pháp này không thể được sử dụng để thử nghiệm rộng rãi các hệ thống chương trình hiện đại

vì kích thước lớn Mặc dù phương pháp này cung cấp kết quả tốt nhất nhưng

nó không phải lúc nào cũng được sử dụng trong các hoàn cảnh của vòng đời phát triển phần mềm hiện đại, trong đó việc phát triển và phát hành sản phẩm ứng dụng là một yếu tố rất quan trọng Đó là lý do tại sao phương pháp xem xét mã code ít được sử dụng, thà rằng người ta cho nhân viên tuy ít kinh nghiệm viết lại toàn bộ code có khi lại chất lượng hơn là việc xem xét các module chương trình Tuy nhiên đây lại là phương pháp nâng cao trình độ kỹ năng của lập trình viên rất tốt nhưng nó không thể được coi là một phương tiện đảm bảo chất lượng đầy đủ

2.3.2 Phân tích code tĩnh

Các trình phân tích code tĩnh giúp các nhà phát triển nhận ra sự cần thiết của việc review code thông thường nhưng không có đủ thời gian cho việc đó Mục đích chính của họ là giảm số lượng code cần được kiểm tra bởi một lập trình viên và do đó giảm thời gian xem xét Các trình phân tích code tĩnh là một lớp lớn các chương trình, được triển khai cho các ngôn ngữ lập trình khác nhau và có một bộ các hàm khác nhau   từ sự kết hợp code đơn giản để phân -tích các đoạn code nguy hiểm tiềm năng Sử dụng hệ thống phân tích tĩnh cho phép cải thiện đáng kể chất lượng code và tìm ra nhiều lỗi Phương pháp phân tích tĩnh được sử dụng khá nhiều và có nhiều tài liệu về cách tiếp cận này Ưu điểm của phương pháp này là nó có thể được sử dụng mà không tính đến độ phức tạp và kích thước của giải pháp chương trình được phát triển

Trang 19

2.3.3 Phân tích code động

Phân tích code động là phân tích phần mềm được cung cấp trong khi thực thi các chương trình trên một bộ xử lý thực hoặc là ảo Phân tích động thường được hiểu là kiểm tra mã chương trình nhằm tối ưu hóa nó

Phân tích động không cho phép tìm kiếm nhiều lỗi và thường không thể thực thi toàn bộ mã chương trình, hoặc trình tự thực thi của nó khác rất nhiều

so với hệ thống thực Bên cạnh đó, phân tích động gây ra gánh nặng tính toán trong quá trình thực thi Đó là lý do tại sao việc thu thập thông tin lược tả toàn diện (thường là tính toán độ phức tạp) thường bị trì hoãn cho đến khi kết thúc quá trình thực thi chương trình được lược tả Tất cả điều này làm cho phương pháp này ít được sử dụng đặc biệt trong trường hợp cần thử nghiệm một ứng dụng có kích thước dữ liệu lớn

2.3.4 Phương pháp hộp trắng

Phương pháp kiểm tra hộp trắng là thực thi số lượng tối đa các nhánh code có thể truy cập với sự trợ giúp của trình gỡ rối hoặc các phương tiện khác Phương pháp này đôi khi cũng được hiểu là một lỗi đơn giản để tìm ra một lỗi nhất định Việc kiểm tra toàn bộ mã chương trình bằng cách sử dụng phương pháp hộp trắng đã là không thể do kích thước khổng lồ của các chương trình code hiện đại Ngày nay, phương pháp kiểm tra hộp trắng thuận tiện ở bước khi tìm thấy lỗi và bạn nên tìm ra nguyên nhân gây ra lỗi đó Phương pháp thử nghiệm hộp trắng có đối thủ của nó để phủ nhận hiệu quả là việc gỡ lỗi các chương trình thời gian thực Lý do chính là khả năng xem chương trình làm việc và đồng thời thay đổi trong đó, là một cách tiếp cận không thể áp dụng được trong lập trình dựa trên số lượng sửa đổi mã lớn bằng phương pháp 'cắt và thử' Phương pháp thử nghiệm hộp trắng trong mọi trường hợp là một cách rất tốn kém để cải thiện chất lượng của các hệ thống chương trình lớn và phức tạp

Trang 20

2.3.5 Phương pháp hộp đen

Phương pháp hộp đen có tiếng tốt hơn Kiểm thử đơn vị cũng có thể được coi là kiểm thử hộp đen Ý tưởng chính của phương pháp này bao gồm viết một tập các đoạn kiểm tra cho các module và chức năng riêng biệt, kiểm tra tất cả các chế độ chính của công việc của nó Một số nguồn tham khảo kiểm thử đơn vị cho phương pháp hộp trắng vì nó dựa trên sự quen thuộc với cấu trúc chương trình Nhưng các chức năng và module không nên được coi là hộp đen bởi vì các kiểm thử đơn vị không nên tính đến tổ chức bên trong của một hàm Lập luận cho phương pháp này là phương pháp phát triển khi các đoạn kiểm tra được phát triển trước khi viết các hàm Điều này cải thiện sự kiểm soát của chức năng của nó từ quan điểm đặc điểm kỹ thuật

Kiểm thử đơn vị đã được đánh giá tốt trong quá trình phát triển các dự án đơn giản cũng như các dự án phức tạp Một trong những ưu điểm của kiểm thử đơn vị là có thể kiểm tra tính chính xác của các thay đổi được thực hiện trong chương trình ngay lập tức trong quá trình phát triển Các lập trình viên

cố gắng làm như vậy cho tất cả các đoạn kiểm tra mất một vài phút để thực hiện sửa chữa trong code, có thể nhận thấy một lỗi ngay lập tức và sửa chữa

2.3.6 Phương pháp kiểm thử thủ công

Đây có lẽ là bước cuối cùng của bất kỳ sự phát triển nào nhưng nó không được coi là một phương pháp tốt và đáng tin cậy Kiểm tra thủ công được tồn tại vì không thể phát hiện tất cả các lỗi trong chế độ tự động hoặc thông qua việc review code Nhưng nếu một chương trình có chất lượng thấp và có nhiều khiếm khuyết bên trong, việc kiểm tra và sửa lỗi của nó có thể mất nhiều thời gian và vẫn không thể cung cấp chất lượng phù hợp của chương trình Phương pháp duy nhất để có được một chương trình chất lượng là chất

Trang 21

lượng code Đó là lý do tại sao chúng ta sẽ không kiểm tra thủ công một là một phương pháp đầy đủ trong quá trình phát triển các dự án lớn.

2.4 Nguyên nhân và phương pháp chi tiết

2.4.1 Tắt cảnh báo (Disabled warnings)

Tất cả các cuốn sách về phát triển phần mềm đều khuyên lập trình viên nên đặt cấp độ cảnh báo cao nhất có thể trong trình biên dịch Nhưng có những tình huống trong thực tiễn khi mức chẩn đoán đối với một số bộ phận

dự án thấp hơn hoặc chẩn đoán thậm chí có thể bị vô hiệu hóa hoàn toàn Do

đó, có thể bỏ lỡ những cảnh báo nghiêm trọng do trình biên dịch tạo ra trong khi chuyển các chương trình trên hệ thống 64-bit mới

Trong khi chuyển một ứng dụng, bạn nên luôn luôn bật cảnh báo cho toàn bộ dự án Điều này sẽ giúp bạn kiểm tra tính tương thích của mã và phân tích mã kỹ lưỡng Cách tiếp cận này có thể giúp bạn tiết kiệm rất nhiều thời gian trong khi gỡ lỗi dự án về kiến trúc mới Đây là một ví dụ đơn giản về tràn bộ nhớ xảy ra trong một chương trình 64 bit nếu chúng ta bỏ q- ua các cảnh báo

unsigned char *array 50]; [

unsigned char size = sizeof(array);

32-bit system: sizeof(array) = 200

64-bit system: sizeof(array) = 400

2.4.2 Sử dụng những hàm với số lượng của những đối số thay đổi

Ví dụ điển hình là sử dụng không chính xác các hàm printf, scanf và các biến thể của chúng:

 const char *invalidFormat = "%u";

size_t value = SIZE_MAX;

printf(invalidFormat, value);

 char buf[9];

Trang 22

sprintf(buf, "%p", pointer);

Trong trường hợp đầu tiên, nhà phát triển đã không tính đến kích thước size_t không tương đương với kiểu unsigned trên nền tảng 64 bit Do đó, nó -

sẽ gây ra in sai kết quả nếu giá trị > UINT_MAX

Trong trường hợp thứ hai, nhà phát triển đã không tính đến kích thước con trỏ sẽ lơn hơn 32 bit trong tương lai Do kết quả mã này sẽ gây tràn bộ đệm -trên kiến trúc 64-bit

Không đúng chức năng sử dụng với một số lượng các đối số thay đổi, là một lỗi điển hình trên tất cả các kiến trúc, không chỉ trên 64 bit Điều này liên -quan đến nguy cơ cơ bản của việc sử dụng các cấu trúc ngôn ngữ C ++ Thực tiễn chung là từ chối chúng và sử dụng các phương pháp lập trình an toàn hơn

Với ví dụ trên phương pháp an toàn hơn đó là có thể thay thế printf băng cout và sprintf với boost :: format hoặc std :: stringstream Nếu bắt buộc sử dụng chức năng của kiểu scanf thì nên sử dụng các macro đặc biệt ví dụ

// PR_SIZET on Win64 = "I"

Trang 23

Giá trị Miêu tả

32 Số bit của con trỏ

0x7FFFFFFF Giá trị lớn nhất biến được chọn trong 32bit Mặt nạ bit cao được

đưa về 0 trong 32- bit0x80000000 Giá trị nhỏ nhất biến được chọn trong 32bit Mặt nạ bit cao nhất

là 1 còn lại là 0 trong 32-bit 0xFFFFFFFF Giá trị lớn nhất của biến 32 bit Một bản ghi khác 1 như một -

dấu hiệu lỗi

Bảng 2.2: Số ma thuật cơ bản có thể gây nguy hiểm trong quá trình dịch chuyển ứng dụng từ nền tảng 32 - bit lên 64 bit -

Chúng ta hãy xem xét một số lỗi liên quan đến việc sử dụng số ma thuật Thường xuyên nhất là sử dụng số để lưu trữ loại kích thước

1) size_t ArraySize = N * sizeof(intptr_t);

intptr_t *Array = (intptr_t *)malloc(ArraySize);

2) size_t values[ARRAY_SIZE];

memset(values, 0, ARRAY_SIZE * sizeof size_t)); (

Trang 24

3) size_t n, newexp;

n = n >> (CHAR_BIT * sizeof(n) - newexp);

2.4.4 Lưu trữ số nguyên trong kiểu double

Kiểu double như là một quy tắc, có kích thước 64bit và tương thích với chuẩn IEEE 754 trên các hệ thống 32- -bit và 64-bit Một số lập trình viên sử dụng kiểu double để lưu trữ và làm việc với các loại số nguyên

Hình 2.1 Lưu trữ số nguyên trong kiểu double Một giá trị gần đúng có thể được sử dụng trong chương trình của bạn,nhưng để an toàn, chúng tôi muốn cảnh báo bạn về các hiệu ứng có thể có đối với kiến trúc mới Trong mọi trường hợp, không nên trộn số học với số học dấu phẩy động

Trang 25

ptrdiff_t SetBitN( ptrdiff_t value, unsignedbitNum){

ptrdiff_t mask = << bitNum; 1

return value | mask; }

Đoạn mã trên chỉ hoạt động trên kiến trúc 32 bit và cho phép định nghĩa các bit từ 0 đến 31 Sau khi chương trình được chuyển lên nền tảng 64- bit, cần phải xác định các bit từ 0 – 63

-Hình 2.2 Tính toán giá trị Mask

Để sửa mã, cần phải làm cho "1" không đổi, cùng kiểu với mặt nạ biến

ptrdiff_t mask = ptrdiff_t(1) << bitNum;

Thêm một câu hỏi nữa Kết quả của hàm chưa sửa chữa SetBitN(0,31) là hướng tới sẽ là gì? Câu trả lời đúng là 0xffffffff80000000 Kết quả của biểu thức 1 << 31 là số âm 2147483648 Số này được tạo thành trong một biến số -nguyên 64 bit như 0xffffffff80000000 Bạn nên nhớ và lưu ý tới những ảnh hưởng của việc chuyển đổi các giá trị của các Kiểu khác nhau Để hiểu rõ hơn

Trang 26

về những thông tin đã được trình bày ở trên, Bảng B4 có chứa các biểu thức

và kết quả về sự chuyển đổi trên hệ thống 64bit

ptrdiff_t Result; Result = 1 << 31; -2147483648 0xffffffff80000000 Result = ptrdiff_t(1) << 31; 2147483648 0x0000000080000000 Result = 1U << 31; 2147483648 0x0000000080000000

Result = ptrdiff_t(1) << 32; 4294967296 0x0000000100000000

Bảng 2.3: Biểu thức dịch bit và kết quả trên hệ thống 64bit

2.4.6 Lưu trữ các giá trị của con trỏ

Nhiều l i sai trong khi sỗ ự di dời trên hệ ề đi u hành 64-bit có liên quan đến việc thay đổ ủi c a một kích thước con trỏ trong m i liên quan đ n kích thước ố ế

của các số nguyên thông thường Các số nguyên thông thường và các con trỏ

có sự tương đồng v ề kích thước trong một môi trường v i mô hình dữ ệớ li u ILP32 Thật đáng tiếc, mã 32-bit dựa trên giả thiết này ở khắp nơi Các con trỏ thư ng được ép kiểu sang int, unsigned int và các kiểu khác không phù ờ

Trang 27

C ả hai ví dụ không tính đ n kích thướế c con tr có th khác v i hỏ ể ớ ệ đi u ềhành 32 bit Chúng s- ử ụ d ng kiểu chuyển đổi rõ ràng, ki u mà xén b t sể ớ ố bit cao trong con trỏ, và điều này là mộ ỗt l i trên hệ ề đi u hành 64-bit Ở đây là các phiên bản hợp lệ đã đư c dùng s ợ ố nguyên kiểu memsize intptr_t và

DWORD_PTR để lưu trữ các giá tr c a con trỏ: ị ủ

Hai ví dụ đư c nghiên c u là nguy cợ ứ ơ bởi vì sự ố c chương trình có thể tìm

ra nó quá muộn Chương trình có thể ậ v n hành một cách hoàn h o v i mả ớ ột lượng nh d liệu trên hệ ềỏ ữ đi u hành 64-bit, trong khi địa chỉ ị ắ ớt nằm ở b c t b

4 Gb đầu tiên củ ộa b nhớ Sau đó, trên ph n đ u chương trình cho mầ ầ ục tiêu

sản xuất số lượng lớn sẽ có sự ấp phát bộ c nh u ra c a 4 Gb đầu tiên Mã ớ đầ ủ

đã cho trong ví dụ ẽ s gây ra một hành vi không xác định của chương trình trên

đối tượng ra của 4 Gb đầu tiên trong khi x lý con trử ỏ

Mã dư i đây sớ ẽ không n và s đư c xu t hi n, thực hiệ ầu tiên ẩ ẽ ợ ấ ệ n đ

void GetBufferAddr( void **retPtr) {

GetBufferAddr((void **)&bufAddress);

Việc sửa lỗi cũng nằm trong lựa chọ ủa kiểu năng l c lưu trn c ự ữ con trỏ

uintptr_t bufAddress;

Trang 28

GetBufferAddr((void **)&bufAddress); //OK

Có những tình huống khi lưu trữ ủ c a một giá tr con trị ỏ ộ m t kiểu 32-bit là thật sự ầ c n thiết Hầu hết các phần như vậy, các tình huống thực sư xuất hiện khi nó cần thi t đ v n hành v i các hàm cũ API Riêng các trư ng h p này, ế ể ậ ớ ờ ợ

ta nên dựa vào các hàm đặc biệt LongToIntPtr, PtrToUlong etc

Tôi mu n nh n mố ấ ạnh r ng nó s là thông l x u đ lưu tr giá tr con tr ằ ẽ ệ ấ ể ữ ị ỏsang các kiểu mà nó luôn cân bằng với 64-bits Ta sẽ có mã đúng đư c hiển ợthị mộ ầ ữt l n n a khi h đi u hành 128-bit sẽ ấệ ề xu t hi n ệ

2.4.7 Memsize kiểu trong union

Đặc trưng của một union chính là với mọi thành phần của union thì khu vực bộ nhớ lưu trữ cũng được phân nhánh, nói vậy tức là chúng nằm chồng lên nhau Mặc dù việc truy cập vào khu vực lưu trữ là khả thi với mọi phần tử bất kỳ, một phần tử được chọn cho mục đích này nên được lựa chọn sao cho kết quả sẽ ko trở nên vô nghĩa

Nên chú ý đến các union có chứa các pointer và các thành phần của

memsize kiểu

Khi có nhu cầu làm việc với một con trỏ như một số nguyên, đôi khi sẽ thuận tiện hơn khi sử dụng union như ví dụ dưới đây, và làm với dạng số của loại không dùng các hình thức chuyển đổi rõ ràng

Trang 29

-làm với một phần nhỏ của m_p Chúng ta nên sử dụng loại phù hợp với kích thước của pointer.

ra một lỗi thuật toán và viết lại mã theo cách như sau

Trang 30

2.4.8 Thay đổi một kiểu mảng

Đôi khi nó là cần thiết (hay chỉ thuận tiện hơn) để trình bày một mảng như các phần tử của một kiểu khác nhau Sự nguy hiểm và an toàn trong chuyển đổi type được thể hiện trong mã dưới đây

int array[4] = { 1, 2, 3, 4 };

enum ENumbers { ZERO, ONE, TWO, THREE, FOUR };

//safe cast (for MSVC2005)

ENumbers *enumPtr = (ENumbers *)(array);

cout << enumPtr[1] << " ";

//unsafe cast

size_t *sizetPtr = (size_t *)(array);

cout << sizetPtr[1] << endl;

//Output on 32-bit system: 2 2

//Output on 64 bit system: 2 17179869187

Khi bạn nhận thấy đầu ra chương trình khác nhau giữa hệ điều hành 32-bit

và 64-bit Trên hệ điều hành 32-bit, việc truy cập vào dãy các item phải được thực hiện chính xác vì các kích thước của kích thước t và int trùng khớp nhau

và ta thấy "2 2"

Trang 31

Trên hệ điều hành 64-bit ta có "2 17179869187" ở đầu ra vì giá trị

17179869187 nằm ở mục đầu tiên của dãysizetPtr (xem hình 3) Trong vài

trường hợp chúng ta cần đến nó nhưng thông thường thì nó là một lỗi sai

Hình 2.3 Thay đổi một kiểu mảng

Đặt vào một tình huống được mô tả cố định thì nó chính là việc chuyển đổi kiểu nguy hiểm bị từ chối bởi việc hiện đại hóa chương trình Một biến thể khác chính là tạo ra một dãy mới và copy các giá trị của bản gốc vào đó

2.4.9 Hàm ảo với các đối số kiểu memsize

Nếu có một lượng lớn các lớp dẫn xuất đồ họa với các hàm ảo trong chương trình của bạn, thì sẽ có một nguy cơ khi không chú ý đến việc sử dụng các đối số khác nhau Tuy nhiên loại này hoàn toàn trùng khớp trên hệ thống 32-bit Chẳng hạn như, trong nhóm cơ bản bạn sử dụng loại size_t như một đối số của một hàm ảo và trong lớp dẫn xuất bạn sử dụng loại không dấu Vì vậy, mã này sẽ sai trên hệ thống 64-bit

Nhưng một lỗi như thế này không nhất thiết phải ẩn đi trong lớp dẫn xuất

đồ họa lớn và đây là một trong những ví dụ

Trang 32

hàm WinHelp nằm trong lớp CWinApp nguyên mẫu như sau:

HELP_CONTEXT);

Chính xác là nó thực hiện một phần chồng chéo của hàm ảo trong lớp

CSampleApp như ta thấ y trong ví dụ Sau đó dự án sẽ được chuyển sang

Microsoft Visual C++ 2005 nơi mà hàm nguyên mẫu trong lớpCWinApp đã

qua một vài thay đổi đã bao hàm sự thay thế của kiểu DWORD với kiểu DWORD_PTR Trên hệ điều hành 32-bit chương trình sẽ làm việc một cách hoàn hảo kể từ khi hai kiểu DWORD và DWORD_PTR trùng khớp nhau Các rắc rối sẽ xuất hiện trong suốt trong việc soạn mã cho một nền tảng 64-bit Chúng ta sẽ có hai hàm có cùng tên nhưng khác thông số và kết quả là mã của người sử dụng sẽ không thực hiện được

Sự hiệu chỉnh nằm ở việc sử dụng các kiểu tương tự trong những hàm ảo tương ứng

class CSampleApp : public CWinApp {

virtual void WinHelp(DWORD_PTR dwData, UINT nCmd); };

Trang 33

2.4.10 Quá trình serialization (tuần tự) và trao đổi dữ liệu

Một điểm quan trọng trong suốt quá trình chuyển đổi của một giải pháp phần mềm trên một nền tảng mới chính là chuỗi trao đổi dữ liệu hiện tại Cần phải đọc các dạng thức của dự án hiện tại để thực hiện việc trao đổi dữ liệu giữa các tiến trình hệ thống 32-bit và 64 bit, etc.-

Nói chung, các lỗi của dạng này trong quy trình tuần tự của kiểumemsizevà trao đổi dữ liệu về các hoạt động sử dụng chúng

PackToBuffer(MemoryBuf, &time, sizeof(time));

Trong tất cả các ví dụ đã cho có lỗi ở hai dạng: sử dụng kiểu kích thước không ổn định trong giao diện hệ nhị phân và bỏ qua thứ tự sắp xếp byte

2.4.10.1 Việc sử dụng các kiểu kích thước không ổn định

Không thể chấp nhận những kiểu mà sự thay đổi kích cỡ của nó phụ thuộc vào môi trường phát triển bên trong giao diện hệ nhị phân của quá trình trao đổi dữ liệu Trong ngôn ngữ C++ các kiểu mẫu đều không có kích thước rõ ràng và vì thế không thể sử dụng tất cả chúng cho mục đích này Đó là lý do tại sao các nhà phát triển của các môi trường phát triển và các lập trình viên đều tự tạo ra các kiểu dữ liệu có kích cỡ chính xác như int8, int16, INT32, word64… etc

Cách sử dụng những kiểu mẫu như vậy cung cấp dữ liệu một cách dễ dàng giữa các chương trình trên cách nền tảng khác nhau, mặc dù cách sử dụng nó khá kỳ quặc Ba ví dụ được viết thiếu chính xác và nó sẽ thể hiện trên sự thay

Trang 34

đổi khả năng chứa đựng một vài kiểu dữ liệu từ hệ điều hành 32 bit đến 64- bit Hãy tính đến trường hợp cần thiết để chứa được những định dạng dữ liệu

-cũ, việc hiệu chỉnh có thể trông như sau:

1) size_t PixelCount;

uint32 tmp;

fread(&tmp, sizeof(tmp), 1, inFile);

PixelCount = static_cast size_t< >(tmp);

PackToBuffer(MemoryBuf, &tmp, sizeof(tmp));

Nhưng việc hiệu chỉnh phiên bản đã được định sẵn có thể không phải là tốt nhất Trong cổng vào trên hệ điều hành 64 bit chương trình có thể xử lý -một khối lượng lớn dữ liệu và việc sử dụng các kiểu của hệ điều hành 32- bittrong dữ liệu có thể trở thành một vấn đề nghiêm trọng Trong trường hợp này chúng ta có thể tách rời mã cũ tương thích với dạng dữ liệu cũ để được hiệu chỉnh những kiểu bị lỗi và thực hiện dạng dữ liệu nhị phân mới tính thêm cả những lỗi làm sai Thêm một biến thể để không nhận các dạng thức nhị phân

và nhận dạng thức văn bản hoặc các dạng thức khác được cung cấp bởi các thư viện riêng lẻ

Ngày đăng: 22/01/2024, 17:09

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Andrey Karpov, Evgeniy Ryzhkov, “20 issues of porting C++ code on the 64- bit platform” Sách, tạp chí
Tiêu đề: 20 issues of porting C++ code on the 64-bit platform
[2] Steve McConnell, “Code Complete, 2nd Edition” Microsoft Press, Paperback, 2nd edition, Published June 2004, 914 pages, ISBN: 0– 7356 – 1967– 0 Sách, tạp chí
Tiêu đề: Code Complete, 2nd Edition
[3] Scott Meyers, Martin Klaus “A First Look at C++ Program Analyzers.”, 1997 Sách, tạp chí
Tiêu đề: A First Look at C++ Program Analyzers
[4] Andrey Karpov, “The forgotten problems of 64-bit programs development” Sách, tạp chí
Tiêu đề: The forgotten problems of 64-bit programs development
[5] Andrew Josey, “Data Size Neutrality and 64 bit Support”. - Sách, tạp chí
Tiêu đề: Data Size Neutrality and 64 bit Support
[6] Evgeniy Ryzhkov. Viva64: what is it and for whom is it meant Khác

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w